home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 142
/
Gekkan Dennou Club - 2000.3 Vol. 142 (Japan).7z
/
Gekkan Dennou Club - 2000.3 Vol. 142 (Japan) (Track 1).bin
/
tools
/
s44play
/
s44p101s.lzh
/
core.s
< prev
next >
Wrap
Text File
|
1999-12-19
|
135KB
|
6,274 lines
.include fefunc.h
.include global.mac
;----------------------------------------------------------------
;再生コアエントリ
;<a2.l:パラメータバッファのアドレス
;<a6.l:base
.text
.align 4,$2048
core_entry::
lea.l (core,pc),a0
moveq.l #-1,d0
bsr takeback
move.l d0,d7
.if TEST_ABSOLUTE=0
lea.l base,a6 ;念のため
.endif
bsr super
move.w sr,-(sp)
ori.w #$0700,sr
move.l timerd_old_vector,d0
beq 1f
move.l d0,TIMERD_VECTOR
clr.l timerd_old_vector
move.b #$00,TCDCR ;TIMERC,TIMERDカウント停止
bclr.b #4,IERB ;TIMERD割り込み禁止,IPRBのbit4もクリアされる
bclr.b #4,IMRB ;TIMERD割り込み禁止
move.b timerd_old_tcdr,TCDR ;TIMERCカウンタ復元
move.b timerd_old_tddr,TDDR ;TIMERDカウンタ復元
move.b timerd_old_tcdcr,TCDCR ;TIMERC,TIMERDカウント開始
bset.b #5,IMRB ;TIMERC割り込み許可
bset.b #5,IERB ;TIMERC割り込み許可
;TIMERCは割り込みを使っていないので,
; ペンディングクリアは不要
tst.b timerd_old_imrb
beq @f
bset.b #4,IMRB ;TIMERD割り込み許可
@@:
tst.b timerd_old_ierb
beq @f
bset.b #4,IERB ;TIMERD割り込み許可
@@:
1:
move.l nmi_old_vector,d0
beq @f
move.l d0,NMI_VECTOR
clr.l nmi_old_vector
@@:
move.l poweroff_old_vector,d0
beq @f
move.l d0,POWEROFF_VECTOR
clr.l poweroff_old_vector
@@:
move.l scsidrv_old_vector,d0
beq @f
move.l d0,SCSIDRV_VECTOR
clr.l scsidrv_old_vector
@@:
tst.b extra_flag
bne 2f
move.l keyin_full_old_vector,d0
beq @f
move.l d0,KEYIN_FULL_VECTOR
clr.l keyin_full_old_vector
@@:
2:
move.w (sp)+,sr
bsr user
1: tst.b sram_write_level
beq 2f
bsr sram_write_disable
bra 1b
2:
1: tst.b scsi_hard_soft_level
beq 2f
bsr scsi_hard_soft_off
bra 1b
2:
bsr tini_opm
tst.b nmi_aborted
bne @f
tst.b poweroff_aborted
bne @f
tst.b break_aborted
bne @f
tst.b ctrlc_aborted
bne @f
bsr close_data ;アボートしたときクローズできないことがある
@@:
move.l d7,d0 ;coreの返却値
rts
;----------------------------------------------------------------
;再生コア
;<a2.l:パラメータバッファのアドレス
;<a6.l:base
.text
.align 4,$2048
core:
bsr open_data
bmi 99f
beq 99f
move.b data_timerd_count,d0
bsr setup_timerd_routine ;open_dataの後に行うこと
bsr init_opm
tst.b mono_play_flag
beq 1f
move.w #$FF00,dummy_opm_data
bra 2f
1: move.l #$7FFF0000,dummy_opm_data
2:
move.l #dummy_opm_data,pointer
tst.b extra_flag
beq @f
moveq.l #0,d0
move.b fadeout_speed,d0 ;フェードアウト速度(0~31,大きいほど速い)
add.w d0,d0
lea.l (extra_fadeout_table,pc),a0
move.w (a0,d0.w),(extra_fadeout_count)r
move.w #-1,(timera_fadeout_counter)r
@@:
bsr super
move.w sr,-(sp)
ori.w #$0700,sr
move.l NMI_VECTOR,nmi_old_vector
move.l #nmi_routine,NMI_VECTOR
move.l POWEROFF_VECTOR,poweroff_old_vector
move.l #poweroff_routine,POWEROFF_VECTOR
.if FORCE_CHANGE_SCSIDRV=0
tst.b old_scsidrv_flag
beq @f
.endif
move.l SCSIDRV_VECTOR,scsidrv_old_vector
move.l #scsidrv_routine,SCSIDRV_VECTOR
@@:
tst.b extra_flag
bne @f
move.l KEYIN_FULL_VECTOR,keyin_full_old_vector
move.l #keyin_full_routine,KEYIN_FULL_VECTOR
@@:
move.w (sp)+,sr
bsr user
bsr init_preconv
lea.l (m_read_message,pc),a0
bsr silent_eprint
.if CURRENT_TIME
clr.l tmp_curtop ;再生中か再生が終わったばかりのデータの先頭
clr.l tmp_cursiz ;再生中か再生が終わったばかりのデータのサイズ
clr.l tmp_nxttop ;再生前か再生が始まったばかりのデータの先頭
clr.l tmp_nxtsiz ;再生前か再生が始まったばかりのデータのサイズ
clr.l tmp_ttlsiz ;再生済みのデータのサイズ
move.l output_frequency,d0 ;出力側のサンプリング周波数
tst.b mono_play_flag
bne @f
add.l d0,d0 ;ステレオ再生のときは2バイト/サンプリング
@@:
;<d0.l:バイト/秒
lea.l tmp_size_table_btm,a0
move.l d0,-(a0) ;バイト/1秒
moveq.l #10,d1
FPACK __UMUL
move.l d0,-(a0) ;バイト/10秒
moveq.l #6,d1
FPACK __UMUL
move.l d0,-(a0) ;バイト/1分
moveq.l #10,d1
FPACK __UMUL
move.l d0,-(a0) ;バイト/10分
moveq.l #10,d1
FPACK __UMUL
subq.l #1,d0
move.l d0,-(a0) ;バイト/99分59秒
clr.l tmp_next_time
lea.l (normal_fadeout_table,pc),a0
moveq.l #0,d0
move.b fadeout_speed,d0 ;フェードアウト速度(0~31,大きいほど速い)
lsl.w #2,d0
move.l (a0,d0.l),d0
move.l tmp_size_table_sec,d1 ;バイト/1秒
FPACK __UMUL
lsr.l #8,d0
move.l d0,normal_fadeout_count ;フェードアウト中に出力されるバイト数
move.l #-1,normal_fadeout_limit
.endif
movea.l buf0top,a0
movea.l buf1top,a1
bsr read_data
ble 99f
.if CURRENT_TIME
move.l tmp_cursiz,d1
add.l d1,tmp_ttlsiz ;再生済みのデータのサイズ
move.l tmp_nxtsiz,tmp_cursiz ;再生中か再生が終わったばかりのデータのサイズ
move.l d0,tmp_nxtsiz ;再生前か再生が始まったばかりのデータのサイズ
move.l tmp_nxttop,tmp_curtop ;再生中か再生が終わったばかりのデータの先頭
move.l buf0top,tmp_nxttop ;再生前か再生が始まったばかりのデータの先頭
.endif
tst.b extra_flag
bne @f
moveq.l #0,d0
bsr core_idle
bmi 89f
@@:
.if 0
tst.b onmem_flag
beq @f
move.l #100*2,d0
bsr wait_sec
@@:
.endif
lea.l (m_play_message,pc),a0
bsr silent_eprint
bsr super
move.w sr,-(sp)
ori.w #$0700,sr
move.b #$08,OPMADR ;KEY ON/OFF
move.b TCDCR,timerd_old_tcdcr
move.b #$00,TCDCR ;TIMERC,TIMERDカウント停止
bclr.b #5,IERB ;TIMERC割り込み禁止,IPRBのbit5もクリアされる
bclr.b #5,IMRB ;TIMERC割り込み禁止
bclr.b #4,IERB ;TIMERD割り込み禁止,IPRBのbit4もクリアされる
sne.b timerd_old_ierb
bclr.b #4,IMRB ;TIMERD割り込み禁止
sne.b timerd_old_imrb
.if TEST_X68000=0
tst.b current_machine_num
bne 1f
.endif
lea.l mono_keyon_x68000,a0
tst.b mono_play_flag
bne 2f
lea.l stereo_keyon_x68000,a0
bra 2f
1: lea.l mono_keyon_x68030,a0
tst.b mono_play_flag
bne 2f
lea.l stereo_keyon_x68030,a0
2:
move.l TIMERD_VECTOR,timerd_old_vector
move.l a0,TIMERD_VECTOR
move.b #KEYON_COUNT,TDDR ;TIMERDは最初は34μs間隔で割り込む(後で変更される)
move.b #$71,TCDCR ;TIMERCは1/200プリスケール(50μs),
;TIMERDは1/4プリスケール(1μs)間隔でカウント開始
bset.b #4,IMRB ;TIMERD割り込み許可
bset.b #4,IERB ;TIMERD割り込み許可
move.w (sp)+,sr
bsr user
.align 4,$2048
;keyonがなるべく正確に行われるように再生が開始されるまでディスクアクセスをしない
core_loop0:
tst.b extra_flag
bne @f
moveq.l #0,d0
bsr core_idle
bmi 89f
@@:
cmpi.l #dummy_opm_data,nxttop
bne core_loop0
tst.b onmem_flag
bne core_onmem
bra core_read2
.align 4,$2048
core_loop1:
.if CURRENT_TIME
bsr current_time
;<d0.l:再生済みのデータのバイト数
bsr print_current_time
;<d0.l:再生済みのデータのバイト数
.endif
bsr core_idle
bmi 89f
cmpi.l #dummy_opm_data,nxttop
bne core_loop1
core_read1:
movea.l buf0top,a0
movea.l buf1top,a1
bsr read_data
ble core_last
.if CURRENT_TIME
move.l tmp_cursiz,d1
add.l d1,tmp_ttlsiz ;再生済みのデータのサイズ
move.l tmp_nxtsiz,tmp_cursiz ;再生中か再生が終わったばかりのデータのサイズ
move.l d0,tmp_nxtsiz ;再生前か再生が始まったばかりのデータのサイズ
move.l tmp_nxttop,tmp_curtop ;再生中か再生が終わったばかりのデータの先頭
move.l buf0top,tmp_nxttop ;再生前か再生が始まったばかりのデータの先頭
.endif
.align 4,$2048
core_loop2:
.if CURRENT_TIME
bsr current_time
;<d0.l:再生済みのデータのバイト数
bsr print_current_time
;<d0.l:再生済みのデータのバイト数
.endif
bsr core_idle
bmi 89f
cmpi.l #dummy_opm_data,nxttop
bne core_loop2
core_read2:
movea.l buf2top,a0
movea.l buf3top,a1
bsr read_data
ble core_last
.if CURRENT_TIME
move.l tmp_cursiz,d1
add.l d1,tmp_ttlsiz ;再生済みのデータのサイズ
move.l tmp_nxtsiz,tmp_cursiz ;再生中か再生が終わったばかりのデータのサイズ
move.l d0,tmp_nxtsiz ;再生前か再生が始まったばかりのデータのサイズ
move.l tmp_nxttop,tmp_curtop ;再生中か再生が終わったばかりのデータの先頭
move.l buf2top,tmp_nxttop ;再生前か再生が始まったばかりのデータの先頭
.endif
bra core_loop1
core_onmem:
.align 4,$2048
core_onmem_loop:
.if CURRENT_TIME
bsr current_time
;<d0.l:再生済みのデータのバイト数
bsr print_current_time
;<d0.l:再生済みのデータのバイト数
.endif
bsr core_idle
bmi 89f
cmpi.l #dummy_opm_data,pointer
bne core_onmem_loop
movea.l buf0top,a0
movea.l buf1top,a1
bsr read_data
ble core_last
.if CURRENT_TIME
move.l tmp_cursiz,d1
add.l d1,tmp_ttlsiz ;再生済みのデータのサイズ
move.l tmp_nxtsiz,tmp_cursiz ;再生中か再生が終わったばかりのデータのサイズ
move.l d0,tmp_nxtsiz ;再生前か再生が始まったばかりのデータのサイズ
move.l tmp_nxttop,tmp_curtop ;再生中か再生が終わったばかりのデータの先頭
move.l buf0top,tmp_nxttop ;再生前か再生が始まったばかりのデータの先頭
.endif
bra core_onmem_loop
.align 4,$2048
core_last:
core_loop3:
.if CURRENT_TIME
bsr current_time
;<d0.l:再生済みのデータのバイト数
bsr print_current_time
;<d0.l:再生済みのデータのバイト数
.endif
bsr core_idle
bmi 89f
cmpi.l #dummy_opm_data,pointer
bne core_loop3
.if CURRENT_TIME
move.l tmp_cursiz,d1
add.l d1,tmp_ttlsiz ;再生済みのデータのサイズ
move.l tmp_nxtsiz,tmp_cursiz ;再生中か再生が終わったばかりのデータのサイズ
clr.l tmp_nxtsiz ;再生前か再生が始まったばかりのデータのサイズ
move.l tmp_nxttop,tmp_curtop ;再生中か再生が終わったばかりのデータの先頭
clr.l tmp_nxttop ;再生前か再生が始まったばかりのデータの先頭
bsr current_time
;<d0.l:再生済みのデータのバイト数
bsr print_current_time
;<d0.l:再生済みのデータのバイト数
.endif
98: bsr silent_ecrlf
moveq.l #0,d0
99: tst.l d0
rts
89: tst.b esc_aborted
beq 98b
bsr silent_ecrlf
moveq.l #-1,d0
bra 99b
.even
extra_fadeout_table:
n = 1
.rept 32
.if TIMERA_MODE=7
;50μs*256*4=51.2ms
.dc.w 9375/(n*n)
.else
.fail 1
.endif
n = n+1
.endm
.if CURRENT_TIME
.align 4,$2048
normal_fadeout_table:
n = 1
.rept 32
.dc.l 256*480/(n*n)
n = n+1
.endm
.endif
m_read_message: .dc.b 'バッファを充填しています',0
m_play_message: .dc.b 13,10
.if CURRENT_TIME
.dc.b '再生中です … '
.else
.dc.b '再生を開始します'
.endif
.dc.b 0
.even
.data
.align 4
timerd_old_vector: .dc.l 0
.data
timerd_old_ierb: .dc.b 0
timerd_old_imrb: .dc.b 0
timerd_old_tcdcr: .dc.b $77
timerd_old_tcdr: .dc.b 200 ;(固定)50μs*200=10ms
timerd_old_tddr: .dc.b 20 ;(固定)50μs*20=1ms
.bss
.even
extra_fadeout_count: .ds.w 1
.if CURRENT_TIME
.align 4
normal_fadeout_count: .ds.l 1
normal_fadeout_limit: .ds.l 1
.endif
.if CURRENT_TIME
;----------------------------------------------------------------
;再生済みのデータのバイト数を得る
;>d0.l:再生済みのデータのバイト数
;?d1-d2
.text
.align 4,$2048
current_time:
movem.l pointer,d0-d1 ;pointerとcurtopを同時に取得するためmovemを使う
;(間に割り込みが入ってはならない)
;d0=pointer,d1=curtop
move.l tmp_ttlsiz,d2
cmp.l tmp_nxttop,d1 ;再生前か再生が始まったばかりのデータの先頭
bne @f
add.l tmp_cursiz,d2 ;再生中か再生が終わったばかりのデータのサイズ
@@: sub.l d1,d0 ;pointer-curtop
add.l d2,d0 ;再生済みのデータのバイト数
rts
;----------------------------------------------------------------
;現在の再生時間を表示する
; ' mm:ss'
;<d0.l:再生済みのデータのバイト数
.text
.align 4,$2048
print_current_time:
tst.b silent_flag
bne 99f
cmp.l tmp_next_time,d0
blo 99f
movem.l d0-d2/a0-a1,-(sp)
move.l d0,d2
lea.l tmp_size_table,a1
cmp.l (a1)+,d2
bls @f
move.l (-4,a1),d2 ;念のため99分59秒で止める
@@: move.l d2,-(sp)
lea.l (-16,sp),sp
movea.l sp,a0
move.b #$0C,(a0)+ ;1カラム右へ
;10分
move.l (a1)+,d1
moveq.l #'0'-1,d0
2: addq.b #1,d0
sub.l d1,d2
bcc 2b
add.l d1,d2
move.b d0,(a0)+
;1分
move.l (a1)+,d1
moveq.l #'0'-1,d0
2: addq.b #1,d0
sub.l d1,d2
bcc 2b
add.l d1,d2
move.b d0,(a0)+
move.b #':',(a0)+
;10秒
move.l (a1)+,d1
moveq.l #'0'-1,d0
2: addq.b #1,d0
sub.l d1,d2
bcc 2b
add.l d1,d2
move.b d0,(a0)+
;1秒
move.l (a1)+,d1
moveq.l #'0'-1,d0
2: addq.b #1,d0
sub.l d1,d2
bcc 2b
add.l d1,d2
move.b d0,(a0)+
moveq.l #$08,d0 ;BS
.rept 6
move.b d0,(a0)+
.endm
sf.b (a0)
movea.l sp,a0
bsr eprint
lea.l (16,sp),sp
move.l -(a1),d0
sub.l d2,d0
add.l (sp)+,d0
move.l d0,tmp_next_time
movem.l (sp)+,d0-d2/a0-a1
99: rts
.bss
.align 4
tmp_size_table: .ds.l 1 ;バイト/99分59秒
.ds.l 1 ;バイト/10分
.ds.l 1 ;バイト/1分
.ds.l 1 ;バイト/10秒
tmp_size_table_sec: .ds.l 1 ;バイト/1秒
tmp_size_table_btm:
tmp_next_time: .ds.l 1 ;次に表示するタイミング
;----------------------------------------------------------------
.endif
;----------------------------------------------------------------
;再生中の再生中止判定
; ESCで再生を中止するため,ESCが押されたかどうか調べる
; extraモードのときはフェードアウトの処理を行う
.if CURRENT_TIME
;<d0.l:再生済みのデータのバイト数
.endif
;<a6.l:base
;>d0.l:0=再生継続,-1=再生中止
;>n-flag:mi=再生中止
;?d1-d2
.text
.align 4,$2048
core_idle:
tst.b extra_flag
bne 10f
;extraモードでないとき
tst.b tab_aborted
bne 91f ;TABが押された
tst.b esc_aborted
bne 90f ;ESC/Qが押された
.if CURRENT_TIME
;<d0.l:再生済みのデータのバイト数
tst.l normal_fadeout_limit
bpl 1f ;フェードアウト中
.endif
tst.b fadeout_requested
beq @f
;フェードアウト開始
.if CURRENT_TIME
;<d0.l:再生済みのデータのバイト数
add.l normal_fadeout_count,d0
move.l d0,normal_fadeout_limit
.endif
bsr do_fadeout
@@:
bra 98f
;フェードアウト中
1: cmp.l normal_fadeout_limit,d0
blo 98f
bra 92f ;フェードアウト完了
;extraモードのとき
10:
.if TEST_ESC
tst.b esc_aborted
bne 90f
.endif
tst.w (timera_fadeout_counter)r
beq 92f ;フェードアウト完了
bpl 2f ;フェードアウト中
1: bsr readControl
beq 2f
and.b #%00100000,d0
beq 1b
;フェードアウト開始
move.w (extra_fadeout_count)r,(timera_fadeout_counter)r
bsr do_fadeout
2:
98: moveq.l #0,d0
99: rts
91: sf.b tab_aborted
92: sf.b fadeout_requested
sf.b fadeout_done_flag
90: moveq.l #-1,d0
bra 99b
.bss
.align 4
tmp_curtop: .ds.l 1 ;再生中か再生が終わったばかりのデータの先頭
tmp_cursiz: .ds.l 1 ;再生中か再生が終わったばかりのデータのサイズ
tmp_nxttop: .ds.l 1 ;再生前か再生が始まったばかりのデータの先頭
tmp_nxtsiz: .ds.l 1 ;再生前か再生が始まったばかりのデータのサイズ
tmp_ttlsiz: .ds.l 1 ;再生済みのデータのサイズ
;----------------------------------------------------------------
;フェードアウトする
.text
.align 4,$2048
do_fadeout:
tst.b fadeout_done_flag
bne 99f
st.b fadeout_done_flag
bsr super
tst.b mono_play_flag
beq 1f
move.w sr,-(sp)
ori.w #$0700,sr
bsr 70f
.irpc %c,0123
move.b #$D8+%c,OPMADR
bsr 60f
.endm
move.b mono_cur_opmadr,OPMADR
bsr 70f
move.w (sp)+,sr
bra 2f
1: move.w sr,-(sp)
ori.w #$0700,sr
bsr 70f
.irpc %c,04152637
move.b #$D8+%c,OPMADR
bsr 60f
.endm
move.w (sp)+,sr
2:
bsr user
99: rts
60: bsr 70f
move.b fadeout_speed,OPMDAT
70: tst.b JOY1
tst.b JOY1
@@: tst.b OPMDAT
bmi @b
rts
.data
fadeout_done_flag: .dc.b 0 ;-1=フェードアウト開始済み
mono_cur_opmadr: .dc.b $78 ;モノラル再生のとき現在のOPMADRの値
;----------------------------------------------------------------
;TIMERD割り込みルーチン
;----------------------------------------------------------------
;高品位再生ルーチン
;----------------------------------------------------------------
;高品位再生の方法
; 1chのPCMを再生するためにOPMを4ch使う
; 矩形波に近くて波長が非常に長い波を,OPMのch1~ch4で,
; 1/4周期(π/2)ずつずらしてkeyonする
; ch1とch3およびch2とch4はそれぞれ位相が180度ずれている
; つまり,ch1が+側にあるときch3は-側,ch2が+側にあるときch4は-側にある
; 1つのchを使い続けることができないので,4つのchを遷移しながら使う
; ch1の1/8周期進んだところから1/4周期は,+側はch1,-側はch3,
; 次の1/4周期は,+側はch2,-側はch4,
; 次は,+側はch3,-側はch1,
; 最後の1/4周期は,+側はch4,-側はch2を使う
; PCMデータをTLに変換てkeyonしたままのchのTLを操作することで波を作る
; PCMデータの絶対値が0から増えるにつれてTLは127から減ってゆく
; TLは7ビットしかないが,127に近い側は分解能が高いので,変位はかなり正確に再現できる
; PCMを乗せるchを切り換えるとき,
; それまで使用していたchのTLを0に戻してから次のchを立ち上げなければならないので,
; どうしてもTL=0のデータが1回分出力されてしまう
; PCMデータの符号が変化するときは,その前後で0に近い方のデータを強制的に0にする
; 波形が少し変化してしまうが,もともと0を横切るときの変位が0に近いデータなので,
; 影響は少ない
; 1/4周期毎のchの遷移のタイミングは個々に厳密である必要はないので,
; PCMデータの符号が変化するまで少し待って,符号が変化したときに便乗して遷移する
; 一定期間符号が変化しなければ強制的に0を挟んで遷移しなければならない
; PCMデータにない0を挟んだときはプチノイズが発生する
; ステレオの場合は上記の処理をleft/rightそれぞれ独立して行いつつ,
; left/right交互に編むようにして進めなければならないので,手順がかなり複雑になる
; 1周期の長さは平均としては極めて正確に管理する必要があるので,
; 割り込み回数だけでなく,正確にカウントできるタイマカウンタを併用する
;----------------------------------------------------------------
;----------------------------------------------------------------
;パラメータ
;OPMで発声する矩形波(に近い音)の1周期を,0.103563秒と仮定する.
;(0.103562秒~0.103566秒の範囲)
;1/2周期は0.0517815秒.
;1/4周期は0.02589075秒.
;KEYON_COUNTとKEYON_INTERVAL
;4チャンネルを1/4周期ずつずらしてkeyonする.
;なるべく正確にkeyonできるように割り込み間隔を調整する.
KEYON_COUNT = 34 ;なるべくTIMERD_COUNTよりも大きくすること.
;ただし,あまり大きくしすぎないこと.
KEYON_INTERVAL1 = 761 ;0.103563/4/0.000034=761.49264705882
KEYON_INTERVAL2 = 762
KEYON_INTERVAL3 = 761
KEYON_INTERVAL4 = 762
;TIMERD_COUNT
;TIMERDの割り込み間隔(μs単位).
;44.1kHzはデータの間隔が1/44100=0.0000226757369614512471655328798186秒であり,
;割り切れないので,周波数の変換が必要.
TIMERD_COUNT = TIMERD_COUNT_000
;FREQUENCY
;サンプリング周波数.
;TIMERDの割り込み間隔とサンプリング周波数の関係
; TIMERD_COUNT(μs) FREQUENCY(Hz)
; 20 50000
; 21 47619
; 22 45455
; 23 43478
; 24 41667
; 25 40000
; 26 38462
; 27 37037
; 28 35714
; 29 34483
; 30 33333
; 31 32258
; 32 31250
; 33 30303
; 34 29412
; 35 28571
; 36 27778
; 37 27027
; 38 26316
; 39 25641
; 40 25000
; 41 24390
; 42 23810
; 43 23256
; 44 22727
; 45 22222
; 46 21739
; 47 21277
; 48 20833
; 49 20408
; 50 20000
FREQUENCY = (1000000+TIMERD_COUNT/2)/TIMERD_COUNT ;モノラルのとき
;FREQUENCY = (1000000+TIMERD_COUNT/2)/(TIMERD_COUNT*2) ;ステレオのとき
;PLAY_INTERVAL
;1/4周期の割り込み回数.
PLAY_INTERVAL = 25890/TIMERD_COUNT ;floor(0.103563/4*1000000)=25890
;DELTA_TIMERC
;1周期の長さの微調整.
;16ビットのワークからこの値を引き,結果の上位8ビットをTIMERCの目標値とする.
;TIMERCは0.000050秒間隔で255~0の間でカウントダウンしている.
;目標の少し手前からTIMERCのカウンタを監視して,1周期の終わりを決定する.
;0.103563/0.000050=2071.26=256*8+23.26より,
;TIMERCのカウンタは1周期の間に8回オーバーフローしてから23.26減る.
DELTA_TIMERC = 5955 ;5955/256=23.26171875
;(23.26171875+256*8)*0.000050=0.1035630859375
;BEFORE_TIMERC
;1周期の終わりの何カウント手前からTIMERCを監視するか.
;1周期の終わりからTIMERCで前後に128カウント以上外れると正常に機能しないので,
;この値はあまり大きくできない.
;小さすぎても,TIMERD割り込みを多く取りこぼしたときに正常に再生できなくなる.
BEFORE_TIMERC = 1600/TIMERD_COUNT ;0.000050*128*1000000=6400,*1/4
;MUTE_DELAY
;データが0になるまで遅延する最大のカウント数.
;チャンネル遷移をデータが0になるまで遅延してノイズを減らす.
;WAVE_FORM=1のとき,矩形波が安定している部分が,位相がπ/2と3π/2の位置に,
;それぞれ前後合わせて約41/96周期=約0.04423秒ある.
;1/4周期よりも0.04423-0.103563/4=0.01833925秒だけ余裕があることになるが,
;中心を外れると音が悪くなるので,あまりずらすことはできない.
MUTE_DELAY = 9169/TIMERD_COUNT ;floor((0.04423-0.103563/4)*100000)=18339,*1/2
;WAVE_FORM=2のとき,矩形波が安定している部分が,位相がπ/2と3π/2の位置に,
;それぞれ前後合わせて約34/96周期=約0.03668秒ある.
;1/4周期よりも0.03668-0.103563/4=0.01079秒だけ余裕があることになる.
;STANDBY_DELAY
;1周期の先頭から矩形波を使い始める位置までのカウント数.
;各チャンネルは1周期の先頭から1/8周期経ったところから使う.
;MUTE_DELAYがあるので少し手前にずらしておく.
STANDBY_DELAY = 12945/TIMERD_COUNT-MUTE_DELAY/2 ;floor(0.103563/8*1000000)=12945
;----------------------------------------------------------------
;パラメータのサンプル
;
; TIMERD_COUNT = 20
; FREQUENCY = 50000 ;1/0.000020=50000
; PLAY_INTERVAL = 1294 ;0.103563/0.000020/4=1294.5375
; BEFORE_TIMERC = 51 ;0.000016*128/0.000020=102.4,/2=51.2
; MUTE_DELAY = 305 ;(0.04423-0.103563/4)/0.000020=916.9625
; ;/3=305.65416666667
; ;0.5/(305*0.000020)=81.967213114754より,
; ;82Hz未満の音にノイズが入る
; STANDBY_DELAY = 647-MUTE_DELAY/3 ;0.103563/8/0.000020=647.26875
;
; TIMERD_COUNT = 50
; FREQUENCY = 20000 ;1/0.000050=20000
; PLAY_INTERVAL = 517 ;0.103563/0.000050/4=517.815
; BEFORE_TIMERC = 20 ;0.000016*128/0.000050=40.96,/2=20.48
; MUTE_DELAY = 122 ;(0.04423-0.103563/4)/0.000050=366.785
; ;/3=122.26166666667
; ;0.5/(122*0.000050)=81.967213114754より,
; ;82Hz未満の音にノイズが入る
; STANDBY_DELAY = 258-MUTE_DELAY/3 ;0.103563/8/0.000050=258.9075
;----------------------------------------------------------------
;セットアップテーブルの構造
.offset 0
STANDBY_DELAY_0: .ds.w 1 ;#STANDBY_DELAY-1
INTERVAL_MONO_LAST_2: .ds.w 1 ;#PLAY_INTERVAL-2-BEFORE_TIMERC-1-MUTE_DELAY
INTERVAL_MONO_LAST_1: .ds.w 1 ;#PLAY_INTERVAL-2-BEFORE_TIMERC-1-(MUTE_DELAY-1)
INTERVAL_MONO_LAST_0: .ds.w 1 ;#PLAY_INTERVAL-2-BEFORE_TIMERC-1
INTERVAL_MONO_2: .ds.w 1 ;#PLAY_INTERVAL-2-1-MUTE_DELAY
INTERVAL_MONO_1: .ds.w 1 ;#PLAY_INTERVAL-2-1-(MUTE_DELAY-1)
INTERVAL_MONO_0: .ds.w 1 ;#PLAY_INTERVAL-2-1
MUTE_STEREO_DELAY_0: .ds.w 1 ;#MUTE_DELAY/2-1
MUTE_MONO_DELAY_1: .ds.w 1 ;#MUTE_DELAY-1-1
MUTE_MONO_DELAY_0: .ds.w 1 ;#MUTE_DELAY-1
INTERVAL_STEREO_2: .ds.w 1 ;#(PLAY_INTERVAL-2-MUTE_DELAY)/2-1
INTERVAL_STEREO_LAST_2: .ds.w 1 ;#(PLAY_INTERVAL-2-BEFORE_TIMERC-MUTE_DELAY)/2-1
INTERVAL_STEREO_LAST_1: .ds.w 1 ;#(PLAY_INTERVAL-2-BEFORE_TIMERC-(MUTE_DELAY-1))/2-1
INTERVAL_STEREO_1: .ds.w 1 ;#(PLAY_INTERVAL-2-(MUTE_DELAY-1))/2-1
INTERVAL_STEREO_0: .ds.w 1 ;#(PLAY_INTERVAL-2)/2-1
SETUP_TABLE_LENGTH:
.text
;----------------------------------------------------------------
;セットアップする領域の初期値
STARTING_STANDBY_DELAY_0 = STANDBY_DELAY-1
STARTING_INTERVAL_MONO_LAST_2 = PLAY_INTERVAL-2-BEFORE_TIMERC-1-MUTE_DELAY
STARTING_INTERVAL_MONO_LAST_1 = PLAY_INTERVAL-2-BEFORE_TIMERC-1-(MUTE_DELAY-1)
STARTING_INTERVAL_MONO_LAST_0 = PLAY_INTERVAL-2-BEFORE_TIMERC-1
STARTING_INTERVAL_MONO_2 = PLAY_INTERVAL-2-1-MUTE_DELAY
STARTING_INTERVAL_MONO_1 = PLAY_INTERVAL-2-1-(MUTE_DELAY-1)
STARTING_INTERVAL_MONO_0 = PLAY_INTERVAL-2-1
STARTING_MUTE_STEREO_DELAY_0 = MUTE_DELAY/2-1
STARTING_MUTE_MONO_DELAY_1 = MUTE_DELAY-1-1
STARTING_MUTE_MONO_DELAY_0 = MUTE_DELAY-1
STARTING_INTERVAL_STEREO_2 = (PLAY_INTERVAL-2-MUTE_DELAY)/2-1
STARTING_INTERVAL_STEREO_LAST_2 = (PLAY_INTERVAL-2-BEFORE_TIMERC-MUTE_DELAY)/2-1
STARTING_INTERVAL_STEREO_LAST_1 = (PLAY_INTERVAL-2-BEFORE_TIMERC-(MUTE_DELAY-1))/2-1
STARTING_INTERVAL_STEREO_1 = (PLAY_INTERVAL-2-(MUTE_DELAY-1))/2-1
STARTING_INTERVAL_STEREO_0 = (PLAY_INTERVAL-2)/2-1
;----------------------------------------------------------------
;TIMERD割り込みルーチンのセットアップ
;<d0.b:TIMERD_COUNT(20~50)
.text
.align 4,$2048
setup_timerd_routine:
movem.l d0-d5/a0-a2,-(sp)
and.l #$000000FF,d0
cmp.b timerd_count,d0
beq 99f ;セットアップ済み
move.b d0,timerd_count ;TIMERD_COUNT
lea.l setup_table,a2
moveq.l #0,d1
move.b d0,d1 ;TIMERD_COUNT
.if TEST_DEBUG_SWITCH
tst.b debug_flag
beq @f
lea.l (m_timerd_count,pc),a0
bsr eprint
move.l d1,d0
bsr utos_eprint
bsr ecrlf
@@:
.endif
.if TEST_DEBUG_SWITCH
move.l debugp,d2
bpl @f
.endif
move.l #25890,d2 ;floor(0.103563/4*1000000)=25890
tst.b current_machine_num
beq @f
move.l #25890,d2 ;floor(0.103563/4*1000000)=25890
@@:
.if TEST_DEBUG_SWITCH
tst.b debug_flag
beq @f
lea.l (m_debugp,pc),a0
bsr eprint
move.l d2,d0
bsr utos_eprint
bsr ecrlf
@@:
.endif
divu.w d1,d2 ;25890/TIMERD_COUNT
;PLAY_INTERVAL
.if TEST_DEBUG_SWITCH
tst.b debug_flag
beq @f
lea.l (m_play_interval,pc),a0
bsr eprint
moveq.l #0,d0
move.w d2,d0
bsr utos_eprint
bsr ecrlf
@@:
.endif
.if TEST_DEBUG_SWITCH
move.l debugb,d3
bpl @f
.endif
move.l #1600,d3 ;0.000050*128*1000000=6400,*1/4
tst.b current_machine_num
beq @f
move.l #1600,d3 ;0.000050*128*1000000=6400,*1/4
@@:
.if TEST_DEBUG_SWITCH
tst.b debug_flag
beq @f
lea.l (m_debugb,pc),a0
bsr eprint
move.l d3,d0
bsr utos_eprint
bsr ecrlf
@@:
.endif
divu.w d1,d3 ;1600/TIMERD_COUNT
;BEFORE_TIMERC
.if TEST_DEBUG_SWITCH
tst.b debug_flag
beq @f
lea.l (m_before_timerc,pc),a0
bsr eprint
moveq.l #0,d0
move.w d3,d0
bsr utos_eprint
bsr ecrlf
@@:
.endif
.if TEST_DEBUG_SWITCH
move.l debugm,d4
bpl @f
.endif
move.l #9169,d4 ;floor((0.04423-0.103563/4)*100000)=18339,*1/2
tst.b current_machine_num
beq @f
move.l #9169,d4 ;floor((0.04423-0.103563/4)*100000)=18339,*1/2
@@:
.if TEST_DEBUG_SWITCH
tst.b debug_flag
beq @f
lea.l (m_debugm,pc),a0
bsr eprint
move.l d4,d0
bsr utos_eprint
bsr ecrlf
@@:
.endif
divu.w d1,d4 ;12226/TIMERD_COUNT
;MUTE_DELAY
.if TEST_DEBUG_SWITCH
tst.b debug_flag
beq @f
lea.l (m_mute_delay,pc),a0
bsr eprint
moveq.l #0,d0
move.w d4,d0
bsr utos_eprint
bsr ecrlf
@@:
.endif
.if TEST_DEBUG_SWITCH
move.l debugs,d5
bpl @f
.endif
move.l #12945,d5 ;floor(0.103563/8*1000000)=12945
tst.b current_machine_num
beq @f
move.l #12945,d5 ;floor(0.103563/8*1000000)=12945
@@:
.if TEST_DEBUG_SWITCH
tst.b debug_flag
beq @f
lea.l (m_debugs,pc),a0
bsr eprint
move.l d5,d0
bsr utos_eprint
bsr ecrlf
@@:
.endif
divu.w d1,d5 ;12945/TIMERD_COUNT
move.w d4,d0 ;MUTE_DELAY
lsr.w #2,d0 ;MUTE_DELAY/4
sub.w d0,d5 ;12945/TIMERD_COUNT-MUTE_DELAY/4
;STANDBY_DELAY
.if TEST_DEBUG_SWITCH
tst.b debug_flag
beq @f
lea.l (m_standby_delay,pc),a0
bsr eprint
moveq.l #0,d0
move.w d5,d0
bsr utos_eprint
bsr ecrlf
@@:
.endif
subq.w #1,d5 ;STANDBY_DELAY-1
move.w d5,(STANDBY_DELAY_0,a2) ;STANDBY_DELAY-1
subq.w #2,d2 ;PLAY_INTERVAL-2
move.w d2,d0 ;PLAY_INTERVAL-2
sub.w d3,d0 ;PLAY_INTERVAL-2-BEFORE_TIMERC
subq.w #1,d0 ;PLAY_INTERVAL-2-BEFORE_TIMERC-1
move.w d0,(INTERVAL_MONO_LAST_0,a2) ;PLAY_INTERVAL-2-BEFORE_TIMERC-1
sub.w d4,d0 ;PLAY_INTERVAL-2-BEFORE_TIMERC-1-MUTE_DELAY
move.w d0,(INTERVAL_MONO_LAST_2,a2) ;PLAY_INTERVAL-2-BEFORE_TIMERC-1-MUTE_DELAY
addq.w #1,d0 ;PLAY_INTERVAL-2-BEFORE_TIMERC-1-(MUTE_DELAY-1)
move.w d0,(INTERVAL_MONO_LAST_1,a2) ;PLAY_INTERVAL-2-BEFORE_TIMERC-1-(MUTE_DELAY-1)
add.w d3,d0 ;PLAY_INTERVAL-2-1-(MUTE_DELAY-1)
move.w d0,(INTERVAL_MONO_1,a2) ;PLAY_INTERVAL-2-1-(MUTE_DELAY-1)
subq.w #1,d0 ;PLAY_INTERVAL-2-1-MUTE_DELAY
move.w d0,(INTERVAL_MONO_2,a2) ;PLAY_INTERVAL-2-1-MUTE_DELAY
add.w d4,d0 ;PLAY_INTERVAL-2-1
move.w d0,(INTERVAL_MONO_0,a2) ;PLAY_INTERVAL-2-1
move.w d4,d0 ;MUTE_DELAY
lsr.w #1,d0 ;MUTE_DELAY/2
subq.w #1,d0 ;MUTE_DELAY/2-1
move.w d0,(MUTE_STEREO_DELAY_0,a2) ;MUTE_DELAY/2-1
move.w d4,d0 ;MUTE_DELAY
subq.w #1,d0 ;MUTE_DELAY-1
move.w d0,(MUTE_MONO_DELAY_0,a2) ;MUTE_DELAY-1
subq.w #1,d0 ;MUTE_DELAY-1-1
move.w d0,(MUTE_MONO_DELAY_1,a2) ;MUTE_DELAY-1-1
move.w d2,d0 ;PLAY_INTERVAL-2
sub.w d4,d0 ;PLAY_INTERVAL-2-MUTE_DELAY
lsr.w #1,d0 ;(PLAY_INTERVAL-2-MUTE_DELAY)/2
subq.w #1,d0 ;(PLAY_INTERVAL-2-MUTE_DELAY)/2-1
move.w d0,(INTERVAL_STEREO_2,a2) ;(PLAY_INTERVAL-2-MUTE_DELAY)/2-1
move.w d2,d0 ;PLAY_INTERVAL-2
sub.w d3,d0 ;PLAY_INTERVAL-2-BEFORE_TIMERC
sub.w d4,d0 ;PLAY_INTERVAL-2-BEFORE_TIMERC-MUTE_DELAY
lsr.w #1,d0 ;(PLAY_INTERVAL-2-BEFORE_TIMERC-MUTE_DELAY)/2
subq.w #1,d0 ;(PLAY_INTERVAL-2-BEFORE_TIMERC-MUTE_DELAY)/2-1
move.w d0,(INTERVAL_STEREO_LAST_2,a2) ;(PLAY_INTERVAL-2-BEFORE_TIMERC-MUTE_DELAY)/2-1
move.w d2,d0 ;PLAY_INTERVAL-2
sub.w d3,d0 ;PLAY_INTERVAL-2-BEFORE_TIMERC
sub.w d4,d0 ;PLAY_INTERVAL-2-BEFORE_TIMERC-MUTE_DELAY
addq.w #1,d0 ;PLAY_INTERVAL-2-BEFORE_TIMERC-(MUTE_DELAY-1)
lsr.w #1,d0 ;(PLAY_INTERVAL-2-BEFORE_TIMERC-(MUTE_DELAY-1))/2
subq.w #1,d0 ;(PLAY_INTERVAL-2-BEFORE_TIMERC-(MUTE_DELAY-1))/2-1
move.w d0,(INTERVAL_STEREO_LAST_1,a2) ;(PLAY_INTERVAL-2-BEFORE_TIMERC-(MUTE_DELAY-1))/2-1
move.w d2,d0 ;PLAY_INTERVAL-2
sub.w d4,d0 ;PLAY_INTERVAL-2-MUTE_DELAY
addq.w #1,d0 ;PLAY_INTERVAL-2-(MUTE_DELAY-1)
lsr.w #1,d0 ;(PLAY_INTERVAL-2-(MUTE_DELAY-1))/2
subq.w #1,d0 ;(PLAY_INTERVAL-2-(MUTE_DELAY-1))/2-1
move.w d0,(INTERVAL_STEREO_1,a2) ;(PLAY_INTERVAL-2-(MUTE_DELAY-1))/2-1
move.w d2,d0 ;PLAY_INTERVAL-2
lsr.w #1,d0 ;(PLAY_INTERVAL-2)/2
subq.w #1,d0 ;(PLAY_INTERVAL-2)/2-1
move.w d0,(INTERVAL_STEREO_0,a2) ;(PLAY_INTERVAL-2)/2-1
lea.l setup_target,a0
lea.l setup_list,a1
move.w #(setup_list_end-setup_list)/4-1,d1
1: adda.w (a1)+,a0 ;オフセット
move.w (a1)+,d0 ;タイプ
move.w (a2,d0.w),(a0)
dbra d1,1b
bsr cache_flush
99:
movem.l (sp)+,d0-d5/a0-a2
rts
.if TEST_DEBUG_SWITCH
m_timerd_count: .dc.b 'TIMERD_COUNT=',0
m_debugp: .dc.b '-debugp=',0
m_play_interval: .dc.b 'PLAY_INTERVAL=',0
m_debugb: .dc.b '-debugb=',0
m_before_timerc: .dc.b 'BEFORE_TIMERC=',0
m_debugm: .dc.b '-debugm=',0
m_mute_delay: .dc.b 'MUTE_DELAY=',0
m_debugs: .dc.b '-debugs=',0
m_standby_delay: .dc.b 'STANDBY_DELAY=',0
.endif
.data
timerd_count: .dc.b -1
.even
setup_table: .ds.b SETUP_TABLE_LENGTH
.data
.if TEST_DEBUG_SWITCH
debug_flag:: .dc.b 0
.align 4
debugp:: .dc.l -1
debugb:: .dc.l -1
debugm:: .dc.l -1
debugs:: .dc.l -1
.endif
;----------------------------------------------------------------
;TIMERD割り込みセットアップマクロ
; SETUP_LIST_START~SETUP_LIST_ENDは1回のみ使用可能
; SETUP_LIST_START~SETUP_LIST_ENDの間に.data領域を記述しないこと
SETUP_LIST_START .macro
.text
.even
setup_target:
prepos = (*)
.data
.even
setup_list:
.text
.endm
SETUP_MOVEW_IMM .macro src,dst
@pos:
move.w #STARTING_&src.w,dst
.data
.dc.w (@pos+2)-prepos,src
.text
prepos = @pos+2
.endm
SETUP_ADDIW_IMM .macro src,dst
@pos:
addi.w #STARTING_&src.w,dst
.data
.dc.w (@pos+2)-prepos,src
.text
prepos = @pos+2
.endm
SETUP_LIST_END .macro
.data
setup_list_end:
.text
.endm
;----------------------------------------------------------------
;変換済みデータをモノラル再生
;----------------------------------------------------------------
mono_body .macro
.text
.even
;----------------------------------------------------------------
KEYON_ENTRY
@mono_keyon1:
DI
move.b #%0_1_1_1_1_000,OPMDAT ;C2=1,M2=1,C1=1,M1=1(CH1)
move.w #KEYON_INTERVAL1-1-1,counter
move.l #@mono_phase1to2,TIMERD_VECTOR
rte
KEYON_ENTRY
@mono_phase1to2:
DI
subq.w #1,counter
bcs @f
rte
@@: move.l #@mono_keyon2,TIMERD_VECTOR
rte
;----------------------------------------------------------------
KEYON_ENTRY
@mono_keyon2:
DI
move.b #%0_1_1_1_1_001,OPMDAT ;C2=1,M2=1,C1=1,M1=1(CH2)
move.w #KEYON_INTERVAL2-1-1,counter
move.l #@mono_phase2to3,TIMERD_VECTOR
rte
KEYON_ENTRY
@mono_phase2to3:
DI
subq.w #1,counter
bcs @f
rte
@@: move.l #@mono_keyon3,TIMERD_VECTOR
rte
;----------------------------------------------------------------
KEYON_ENTRY
@mono_keyon3:
DI
move.b #%0_1_1_1_1_010,OPMDAT ;C2=1,M2=1,C1=1,M1=1(CH3)
move.w #KEYON_INTERVAL3-1-1,counter
move.l #@mono_phase3to4,TIMERD_VECTOR
rte
KEYON_ENTRY
@mono_phase3to4:
DI
subq.w #1,counter
bcs @f
rte
@@: move.l #@mono_keyon4,TIMERD_VECTOR
rte
;----------------------------------------------------------------
KEYON_ENTRY
@mono_keyon4:
DI
move.b #%0_1_1_1_1_011,OPMDAT ;C2=1,M2=1,C1=1,M1=1(CH4)
move.w #KEYON_INTERVAL4-1-1,counter
move.l #@mono_phase4to1,TIMERD_VECTOR
rte
KEYON_ENTRY
@mono_phase4to1:
DI
subq.w #1,counter
bcs @f
rte
@@: SETUP_MOVEW_IMM STANDBY_DELAY_0,counter
move.l #@mono_standby,TIMERD_VECTOR
move.b timerd_count,TDDR ;TIMERD割り込み間隔を変更する
rte
KEYON_ENTRY
@mono_standby:
TIMERD_DI
subq.w #1,counter
bcs @f
rte
@@: move.b #0,TCDR ;TIMERCカウンタ初期化
move.w #(-DELTA_TIMERC).and.$FFFF,delta_timerc
SETUP_MOVEW_IMM INTERVAL_MONO_0,counter
move.l #@mono1_start_1,TIMERD_VECTOR
rte
;----------------------------------------------------------------
MONO_ENTRY
@mono1_start_1:
TIMERD_DI
VISUAL 1,0
move.b #$78,OPMADR ;(CH1C2)TL
move.b #$78,mono_cur_opmadr
mono_both_play 1,a0
move.l #@mono1_playloop_1,TIMERD_VECTOR
rte
mono_both_over a0
move.l #@mono1_play_3,TIMERD_VECTOR
rte
MONO_ENTRY
@mono1_start_3:
TIMERD_DI
VISUAL 1,0
move.b #$7A,OPMADR ;(CH3C2)TL
move.b #$7A,mono_cur_opmadr
mono_both_play 1,a0
move.l #@mono1_playloop_3,TIMERD_VECTOR
rte
mono_both_over a0
move.l #@mono1_play_1,TIMERD_VECTOR
rte
MONO_ENTRY
@mono1_play_1:
TIMERD_DI
VISUAL 1,0
move.b #$78,OPMADR ;(CH1C2)TL
move.b #$78,mono_cur_opmadr
mono_both_play 1,a0
subq.w #1,counter
bcs @f
move.l #@mono1_playloop_1,TIMERD_VECTOR
rte
@@: SETUP_MOVEW_IMM MUTE_MONO_DELAY_0,counter
move.l #@mono1_extloop_1,TIMERD_VECTOR
rte
mono_both_over a0
subq.w #1,counter
bcs @f
move.l #@mono1_play_3,TIMERD_VECTOR
rte
@@: move.l #@mono1_ext_3,TIMERD_VECTOR
rte
MONO_ENTRY
@mono1_play_3:
TIMERD_DI
VISUAL 1,0
move.b #$7A,OPMADR ;(CH3C2)TL
move.b #$7A,mono_cur_opmadr
mono_both_play 1,a0
subq.w #1,counter
bcs @f
move.l #@mono1_playloop_3,TIMERD_VECTOR
rte
@@: SETUP_MOVEW_IMM MUTE_MONO_DELAY_0,counter
move.l #@mono1_extloop_3,TIMERD_VECTOR
rte
mono_both_over a0
subq.w #1,counter
bcs @f
move.l #@mono1_play_1,TIMERD_VECTOR
rte
@@: move.l #@mono1_ext_1,TIMERD_VECTOR
rte
MONO_ENTRY
@mono1_playloop_1:
TIMERD_DI
VISUAL 1,0
mono_both_play 0,a0
subq.w #1,counter
bcs @f
rte
@@: SETUP_MOVEW_IMM MUTE_MONO_DELAY_0,counter
move.l #@mono1_extloop_1,TIMERD_VECTOR
rte
mono_both_over a0
subq.w #1,counter
bcs @f
move.l #@mono1_play_3,TIMERD_VECTOR
rte
@@: move.l #@mono1_ext_3,TIMERD_VECTOR
rte
MONO_ENTRY
@mono1_playloop_3:
TIMERD_DI
VISUAL 1,0
mono_both_play 0,a0
subq.w #1,counter
bcs @f
rte
@@: SETUP_MOVEW_IMM MUTE_MONO_DELAY_0,counter
move.l #@mono1_extloop_3,TIMERD_VECTOR
rte
mono_both_over a0
subq.w #1,counter
bcs @f
move.l #@mono1_play_1,TIMERD_VECTOR
rte
@@: move.l #@mono1_ext_1,TIMERD_VECTOR
rte
MONO_ENTRY
@mono1_ext_1:
TIMERD_DI
VISUAL 1,1
move.b #$78,OPMADR ;(CH1C2)TL
move.b #$78,mono_cur_opmadr
mono_both_play 1,a0
SETUP_MOVEW_IMM MUTE_MONO_DELAY_1,counter
move.l #@mono1_extloop_1,TIMERD_VECTOR
rte
mono_both_over a0
SETUP_MOVEW_IMM INTERVAL_MONO_0,counter
move.l #@mono2_start_4,TIMERD_VECTOR
rte
MONO_ENTRY
@mono1_ext_3:
TIMERD_DI
VISUAL 1,1
move.b #$7A,OPMADR ;(CH3C2)TL
move.b #$7A,mono_cur_opmadr
mono_both_play 1,a0
SETUP_MOVEW_IMM MUTE_MONO_DELAY_1,counter
move.l #@mono1_extloop_3,TIMERD_VECTOR
rte
mono_both_over a0
SETUP_MOVEW_IMM INTERVAL_MONO_0,counter
move.l #@mono2_start_2,TIMERD_VECTOR
rte
MONO_ENTRY
@mono1_extloop_1:
TIMERD_DI
VISUAL 1,1
mono_both_play 0,a0
subq.w #1,counter
bcs @f
rte
@@: move.l #@mono1_mute_1,TIMERD_VECTOR
rte
mono_both_over a0
SETUP_ADDIW_IMM INTERVAL_MONO_2,counter
move.l #@mono2_start_4,TIMERD_VECTOR
rte
MONO_ENTRY
@mono1_extloop_3:
TIMERD_DI
VISUAL 1,1
mono_both_play 0,a0
subq.w #1,counter
bcs @f
rte
@@: move.l #@mono1_mute_3,TIMERD_VECTOR
rte
mono_both_over a0
SETUP_ADDIW_IMM INTERVAL_MONO_2,counter
move.l #@mono2_start_2,TIMERD_VECTOR
rte
MONO_ENTRY
@mono1_mute_1:
TIMERD_DI
VISUAL 1,3
move.b #ZERO_TL,OPMDAT
SETUP_ADDIW_IMM INTERVAL_MONO_1,counter
move.l #@mono2_start_2,TIMERD_VECTOR
rte
MONO_ENTRY
@mono1_mute_3:
TIMERD_DI
VISUAL 1,3
move.b #ZERO_TL,OPMDAT
SETUP_ADDIW_IMM INTERVAL_MONO_1,counter
move.l #@mono2_start_4,TIMERD_VECTOR
rte
;----------------------------------------------------------------
MONO_ENTRY
@mono2_start_2:
TIMERD_DI
VISUAL 2,0
move.b #$79,OPMADR ;(CH2C2)TL
move.b #$79,mono_cur_opmadr
mono_both_play 1,a0
move.l #@mono2_playloop_2,TIMERD_VECTOR
rte
mono_both_over a0
move.l #@mono2_play_4,TIMERD_VECTOR
rte
MONO_ENTRY
@mono2_start_4:
TIMERD_DI
VISUAL 2,0
move.b #$7B,OPMADR ;(CH4C2)TL
move.b #$7B,mono_cur_opmadr
mono_both_play 1,a0
move.l #@mono2_playloop_4,TIMERD_VECTOR
rte
mono_both_over a0
move.l #@mono2_play_2,TIMERD_VECTOR
rte
MONO_ENTRY
@mono2_play_2:
TIMERD_DI
VISUAL 2,0
move.b #$79,OPMADR ;(CH2C2)TL
move.b #$79,mono_cur_opmadr
mono_both_play 1,a0
subq.w #1,counter
bcs @f
move.l #@mono2_playloop_2,TIMERD_VECTOR
rte
@@: SETUP_MOVEW_IMM MUTE_MONO_DELAY_0,counter
move.l #@mono2_extloop_2,TIMERD_VECTOR
rte
mono_both_over a0
subq.w #1,counter
bcs @f
move.l #@mono2_play_4,TIMERD_VECTOR
rte
@@: move.l #@mono2_ext_4,TIMERD_VECTOR
rte
MONO_ENTRY
@mono2_play_4:
TIMERD_DI
VISUAL 2,0
move.b #$7B,OPMADR ;(CH4C2)TL
move.b #$7B,mono_cur_opmadr
mono_both_play 1,a0
subq.w #1,counter
bcs @f
move.l #@mono2_playloop_4,TIMERD_VECTOR
rte
@@: SETUP_MOVEW_IMM MUTE_MONO_DELAY_0,counter
move.l #@mono2_extloop_4,TIMERD_VECTOR
rte
mono_both_over a0
subq.w #1,counter
bcs @f
move.l #@mono2_play_2,TIMERD_VECTOR
rte
@@: move.l #@mono2_ext_2,TIMERD_VECTOR
rte
MONO_ENTRY
@mono2_playloop_2:
TIMERD_DI
VISUAL 2,0
mono_both_play 0,a0
subq.w #1,counter
bcs @f
rte
@@: SETUP_MOVEW_IMM MUTE_MONO_DELAY_0,counter
move.l #@mono2_extloop_2,TIMERD_VECTOR
rte
mono_both_over a0
subq.w #1,counter
bcs @f
move.l #@mono2_play_4,TIMERD_VECTOR
rte
@@: move.l #@mono2_ext_4,TIMERD_VECTOR
rte
MONO_ENTRY
@mono2_playloop_4:
TIMERD_DI
VISUAL 2,0
mono_both_play 0,a0
subq.w #1,counter
bcs @f
rte
@@: SETUP_MOVEW_IMM MUTE_MONO_DELAY_0,counter
move.l #@mono2_extloop_4,TIMERD_VECTOR
rte
mono_both_over a0
subq.w #1,counter
bcs @f
move.l #@mono2_play_2,TIMERD_VECTOR
rte
@@: move.l #@mono2_ext_2,TIMERD_VECTOR
rte
MONO_ENTRY
@mono2_ext_2:
TIMERD_DI
VISUAL 2,1
move.b #$79,OPMADR ;(CH2C2)TL
move.b #$79,mono_cur_opmadr
mono_both_play 1,a0
SETUP_MOVEW_IMM MUTE_MONO_DELAY_1,counter
move.l #@mono2_extloop_2,TIMERD_VECTOR
rte
mono_both_over a0
SETUP_MOVEW_IMM INTERVAL_MONO_0,counter
move.l #@mono3_start_1,TIMERD_VECTOR
rte
MONO_ENTRY
@mono2_ext_4:
TIMERD_DI
VISUAL 2,1
move.b #$7B,OPMADR ;(CH4C2)TL
move.b #$7B,mono_cur_opmadr
mono_both_play 1,a0
SETUP_MOVEW_IMM MUTE_MONO_DELAY_1,counter
move.l #@mono2_extloop_4,TIMERD_VECTOR
rte
mono_both_over a0
SETUP_MOVEW_IMM INTERVAL_MONO_0,counter
move.l #@mono3_start_3,TIMERD_VECTOR
rte
MONO_ENTRY
@mono2_extloop_2:
TIMERD_DI
VISUAL 2,1
mono_both_play 0,a0
subq.w #1,counter
bcs @f
rte
@@: move.l #@mono2_mute_2,TIMERD_VECTOR
rte
mono_both_over a0
SETUP_ADDIW_IMM INTERVAL_MONO_2,counter
move.l #@mono3_start_1,TIMERD_VECTOR
rte
MONO_ENTRY
@mono2_extloop_4:
TIMERD_DI
VISUAL 2,1
mono_both_play 0,a0
subq.w #1,counter
bcs @f
rte
@@: move.l #@mono2_mute_4,TIMERD_VECTOR
rte
mono_both_over a0
SETUP_ADDIW_IMM INTERVAL_MONO_2,counter
move.l #@mono3_start_3,TIMERD_VECTOR
rte
MONO_ENTRY
@mono2_mute_2:
TIMERD_DI
VISUAL 2,3
move.b #ZERO_TL,OPMDAT
SETUP_ADDIW_IMM INTERVAL_MONO_1,counter
move.l #@mono3_start_3,TIMERD_VECTOR
rte
MONO_ENTRY
@mono2_mute_4:
TIMERD_DI
VISUAL 2,3
move.b #ZERO_TL,OPMDAT
SETUP_ADDIW_IMM INTERVAL_MONO_1,counter
move.l #@mono3_start_1,TIMERD_VECTOR
rte
;----------------------------------------------------------------
MONO_ENTRY
@mono3_start_3:
TIMERD_DI
VISUAL 3,0
move.b #$7A,OPMADR ;(CH3C2)TL
move.b #$7A,mono_cur_opmadr
mono_both_play 1,a0
move.l #@mono3_playloop_3,TIMERD_VECTOR
rte
mono_both_over a0
move.l #@mono3_play_1,TIMERD_VECTOR
rte
MONO_ENTRY
@mono3_start_1:
TIMERD_DI
VISUAL 3,0
move.b #$78,OPMADR ;(CH1C2)TL
move.b #$78,mono_cur_opmadr
mono_both_play 1,a0
move.l #@mono3_playloop_1,TIMERD_VECTOR
rte
mono_both_over a0
move.l #@mono3_play_3,TIMERD_VECTOR
rte
MONO_ENTRY
@mono3_play_3:
TIMERD_DI
VISUAL 3,0
move.b #$7A,OPMADR ;(CH3C2)TL
move.b #$7A,mono_cur_opmadr
mono_both_play 1,a0
subq.w #1,counter
bcs @f
move.l #@mono3_playloop_3,TIMERD_VECTOR
rte
@@: SETUP_MOVEW_IMM MUTE_MONO_DELAY_0,counter
move.l #@mono3_extloop_3,TIMERD_VECTOR
rte
mono_both_over a0
subq.w #1,counter
bcs @f
move.l #@mono3_play_1,TIMERD_VECTOR
rte
@@: move.l #@mono3_ext_1,TIMERD_VECTOR
rte
MONO_ENTRY
@mono3_play_1:
TIMERD_DI
VISUAL 3,0
move.b #$78,OPMADR ;(CH1C2)TL
move.b #$78,mono_cur_opmadr
mono_both_play 1,a0
subq.w #1,counter
bcs @f
move.l #@mono3_playloop_1,TIMERD_VECTOR
rte
@@: SETUP_MOVEW_IMM MUTE_MONO_DELAY_0,counter
move.l #@mono3_extloop_1,TIMERD_VECTOR
rte
mono_both_over a0
subq.w #1,counter
bcs @f
move.l #@mono3_play_3,TIMERD_VECTOR
rte
@@: move.l #@mono3_ext_3,TIMERD_VECTOR
rte
MONO_ENTRY
@mono3_playloop_3:
TIMERD_DI
VISUAL 3,0
mono_both_play 0,a0
subq.w #1,counter
bcs @f
rte
@@: SETUP_MOVEW_IMM MUTE_MONO_DELAY_0,counter
move.l #@mono3_extloop_3,TIMERD_VECTOR
rte
mono_both_over a0
subq.w #1,counter
bcs @f
move.l #@mono3_play_1,TIMERD_VECTOR
rte
@@: move.l #@mono3_ext_1,TIMERD_VECTOR
rte
MONO_ENTRY
@mono3_playloop_1:
TIMERD_DI
VISUAL 3,0
mono_both_play 0,a0
subq.w #1,counter
bcs @f
rte
@@: SETUP_MOVEW_IMM MUTE_MONO_DELAY_0,counter
move.l #@mono3_extloop_1,TIMERD_VECTOR
rte
mono_both_over a0
subq.w #1,counter
bcs @f
move.l #@mono3_play_3,TIMERD_VECTOR
rte
@@: move.l #@mono3_ext_3,TIMERD_VECTOR
rte
MONO_ENTRY
@mono3_ext_3:
TIMERD_DI
VISUAL 3,1
move.b #$7A,OPMADR ;(CH3C2)TL
move.b #$7A,mono_cur_opmadr
mono_both_play 1,a0
SETUP_MOVEW_IMM MUTE_MONO_DELAY_1,counter
move.l #@mono3_extloop_3,TIMERD_VECTOR
rte
mono_both_over a0
SETUP_MOVEW_IMM INTERVAL_MONO_LAST_0,counter
move.l #@mono4_start_2,TIMERD_VECTOR
rte
MONO_ENTRY
@mono3_ext_1:
TIMERD_DI
VISUAL 3,1
move.b #$78,OPMADR ;(CH1C2)TL
move.b #$78,mono_cur_opmadr
mono_both_play 1,a0
SETUP_MOVEW_IMM MUTE_MONO_DELAY_1,counter
move.l #@mono3_extloop_1,TIMERD_VECTOR
rte
mono_both_over a0
SETUP_MOVEW_IMM INTERVAL_MONO_LAST_0,counter
move.l #@mono4_start_4,TIMERD_VECTOR
rte
MONO_ENTRY
@mono3_extloop_3:
TIMERD_DI
VISUAL 3,1
mono_both_play 0,a0
subq.w #1,counter
bcs @f
rte
@@: move.l #@mono3_mute_3,TIMERD_VECTOR
rte
mono_both_over a0
SETUP_ADDIW_IMM INTERVAL_MONO_LAST_2,counter
move.l #@mono4_start_2,TIMERD_VECTOR
rte
MONO_ENTRY
@mono3_extloop_1:
TIMERD_DI
VISUAL 3,1
mono_both_play 0,a0
subq.w #1,counter
bcs @f
rte
@@: move.l #@mono3_mute_1,TIMERD_VECTOR
rte
mono_both_over a0
SETUP_ADDIW_IMM INTERVAL_MONO_LAST_2,counter
move.l #@mono4_start_4,TIMERD_VECTOR
rte
MONO_ENTRY
@mono3_mute_3:
TIMERD_DI
VISUAL 3,3
move.b #ZERO_TL,OPMDAT
SETUP_ADDIW_IMM INTERVAL_MONO_LAST_1,counter
move.l #@mono4_start_4,TIMERD_VECTOR
rte
MONO_ENTRY
@mono3_mute_1:
TIMERD_DI
VISUAL 3,3
move.b #ZERO_TL,OPMDAT
SETUP_ADDIW_IMM INTERVAL_MONO_LAST_1,counter
move.l #@mono4_start_2,TIMERD_VECTOR
rte
;----------------------------------------------------------------
MONO_ENTRY
@mono4_start_4:
TIMERD_DI
VISUAL 4,0
move.b #$7B,OPMADR ;(CH4C2)TL
move.b #$7B,mono_cur_opmadr
mono_both_play 1,a0
move.l #@mono4_playloop_4,TIMERD_VECTOR
rte
mono_both_over a0
move.l #@mono4_play_2,TIMERD_VECTOR
rte
MONO_ENTRY
@mono4_start_2:
TIMERD_DI
VISUAL 4,0
move.b #$79,OPMADR ;(CH2C2)TL
move.b #$79,mono_cur_opmadr
mono_both_play 1,a0
move.l #@mono4_playloop_2,TIMERD_VECTOR
rte
mono_both_over a0
move.l #@mono4_play_4,TIMERD_VECTOR
rte
MONO_ENTRY
@mono4_play_4:
TIMERD_DI
VISUAL 4,0
move.b #$7B,OPMADR ;(CH4C2)TL
move.b #$7B,mono_cur_opmadr
mono_both_play 1,a0
subq.w #1,counter
bcs @f
move.l #@mono4_playloop_4,TIMERD_VECTOR
rte
@@: move.l #@mono4_lastloop_4,TIMERD_VECTOR
rte
mono_both_over a0
subq.w #1,counter
bcs @f
move.l #@mono4_play_2,TIMERD_VECTOR
rte
@@: move.l #@mono4_last_2,TIMERD_VECTOR
rte
MONO_ENTRY
@mono4_play_2:
TIMERD_DI
VISUAL 4,0
move.b #$79,OPMADR ;(CH2C2)TL
move.b #$79,mono_cur_opmadr
mono_both_play 1,a0
subq.w #1,counter
bcs @f
move.l #@mono4_playloop_2,TIMERD_VECTOR
rte
@@: move.l #@mono4_lastloop_2,TIMERD_VECTOR
rte
mono_both_over a0
subq.w #1,counter
bcs @f
move.l #@mono4_play_4,TIMERD_VECTOR
rte
@@: move.l #@mono4_last_4,TIMERD_VECTOR
rte
MONO_ENTRY
@mono4_playloop_4:
TIMERD_DI
VISUAL 4,0
mono_both_play 0,a0
subq.w #1,counter
bcs @f
rte
@@: move.l #@mono4_lastloop_4,TIMERD_VECTOR
rte
mono_both_over a0
subq.w #1,counter
bcs @f
move.l #@mono4_play_2,TIMERD_VECTOR
rte
@@: move.l #@mono4_last_2,TIMERD_VECTOR
rte
MONO_ENTRY
@mono4_playloop_2:
TIMERD_DI
VISUAL 4,0
mono_both_play 0,a0
subq.w #1,counter
bcs @f
rte
@@: move.l #@mono4_lastloop_2,TIMERD_VECTOR
rte
mono_both_over a0
subq.w #1,counter
bcs @f
move.l #@mono4_play_4,TIMERD_VECTOR
rte
@@: move.l #@mono4_last_4,TIMERD_VECTOR
rte
MONO_ENTRY
@mono4_last_4:
TIMERD_DI
VISUAL 4,0
move.b #$7B,OPMADR ;(CH4C2)TL
move.b #$7B,mono_cur_opmadr
mono_both_play 1,a0
DELTA_CHECK
move.l #@mono4_lastloop_4,TIMERD_VECTOR
rte
DELTA_OVER
SETUP_MOVEW_IMM MUTE_MONO_DELAY_0,counter
move.l #@mono4_extloop_4,TIMERD_VECTOR
rte
mono_both_over a0
DELTA_CHECK
move.l #@mono4_last_2,TIMERD_VECTOR
rte
DELTA_OVER
move.l #@mono4_ext_2,TIMERD_VECTOR
rte
MONO_ENTRY
@mono4_last_2:
TIMERD_DI
VISUAL 4,0
move.b #$79,OPMADR ;(CH2C2)TL
move.b #$79,mono_cur_opmadr
mono_both_play 1,a0
DELTA_CHECK
move.l #@mono4_lastloop_2,TIMERD_VECTOR
rte
DELTA_OVER
SETUP_MOVEW_IMM MUTE_MONO_DELAY_0,counter
move.l #@mono4_extloop_2,TIMERD_VECTOR
rte
mono_both_over a0
DELTA_CHECK
move.l #@mono4_last_4,TIMERD_VECTOR
rte
DELTA_OVER
move.l #@mono4_ext_4,TIMERD_VECTOR
rte
MONO_ENTRY
@mono4_lastloop_4:
TIMERD_DI
VISUAL 4,0
mono_both_play 0,a0
DELTA_CHECK
rte
DELTA_OVER
SETUP_MOVEW_IMM MUTE_MONO_DELAY_0,counter
move.l #@mono4_extloop_4,TIMERD_VECTOR
rte
mono_both_over a0
DELTA_CHECK
move.l #@mono4_last_2,TIMERD_VECTOR
rte
DELTA_OVER
move.l #@mono4_ext_2,TIMERD_VECTOR
rte
MONO_ENTRY
@mono4_lastloop_2:
TIMERD_DI
VISUAL 4,0
mono_both_play 0,a0
DELTA_CHECK
rte
DELTA_OVER
SETUP_MOVEW_IMM MUTE_MONO_DELAY_0,counter
move.l #@mono4_extloop_2,TIMERD_VECTOR
rte
mono_both_over a0
DELTA_CHECK
move.l #@mono4_last_4,TIMERD_VECTOR
rte
DELTA_OVER
move.l #@mono4_ext_4,TIMERD_VECTOR
rte
MONO_ENTRY
@mono4_ext_4:
TIMERD_DI
VISUAL 4,1
move.b #$7B,OPMADR ;(CH4C2)TL
move.b #$7B,mono_cur_opmadr
mono_both_play 1,a0
SETUP_MOVEW_IMM MUTE_MONO_DELAY_1,counter
move.l #@mono4_extloop_4,TIMERD_VECTOR
rte
mono_both_over a0
SETUP_MOVEW_IMM INTERVAL_MONO_0,counter
move.l #@mono1_start_3,TIMERD_VECTOR
rte
MONO_ENTRY
@mono4_ext_2:
TIMERD_DI
VISUAL 4,1
move.b #$79,OPMADR ;(CH2C2)TL
move.b #$79,mono_cur_opmadr
mono_both_play 1,a0
SETUP_MOVEW_IMM MUTE_MONO_DELAY_1,counter
move.l #@mono4_extloop_2,TIMERD_VECTOR
rte
mono_both_over a0
SETUP_MOVEW_IMM INTERVAL_MONO_0,counter
move.l #@mono1_start_1,TIMERD_VECTOR
rte
MONO_ENTRY
@mono4_extloop_4:
TIMERD_DI
VISUAL 4,1
mono_both_play 0,a0
subq.w #1,counter
bcs @f
rte
@@: move.l #@mono4_mute_4,TIMERD_VECTOR
rte
mono_both_over a0
SETUP_ADDIW_IMM INTERVAL_MONO_2,counter
move.l #@mono1_start_3,TIMERD_VECTOR
rte
MONO_ENTRY
@mono4_extloop_2:
TIMERD_DI
VISUAL 4,1
mono_both_play 0,a0
subq.w #1,counter
bcs @f
rte
@@: move.l #@mono4_mute_2,TIMERD_VECTOR
rte
mono_both_over a0
SETUP_ADDIW_IMM INTERVAL_MONO_2,counter
move.l #@mono1_start_1,TIMERD_VECTOR
rte
MONO_ENTRY
@mono4_mute_4:
TIMERD_DI
VISUAL 4,3
move.b #ZERO_TL,OPMDAT
SETUP_ADDIW_IMM INTERVAL_MONO_1,counter
move.l #@mono1_start_1,TIMERD_VECTOR
rte
MONO_ENTRY
@mono4_mute_2:
TIMERD_DI
VISUAL 4,3
move.b #ZERO_TL,OPMDAT
SETUP_ADDIW_IMM INTERVAL_MONO_1,counter
move.l #@mono1_start_3,TIMERD_VECTOR
rte
;----------------------------------------------------------------
.endm
;----------------------------------------------------------------
;変換済みデータをステレオ再生
;----------------------------------------------------------------
stereo_body .macro
.text
.even
;----------------------------------------------------------------
KEYON_ENTRY
@stereo_keyon1:
DI
move.b #%0_1_1_1_1_000,OPMDAT ;C2=1,M2=1,C1=1,M1=1(CH1)
move.l #@stereo_keyon5,TIMERD_VECTOR
rte
KEYON_ENTRY
@stereo_keyon5:
DI
move.b #%0_1_1_1_1_100,OPMDAT ;C2=1,M2=1,C1=1,M1=1(CH5)
move.w #KEYON_INTERVAL1-2-1,counter
move.l #@stereo_phase1to2,TIMERD_VECTOR
rte
KEYON_ENTRY
@stereo_phase1to2:
DI
subq.w #1,counter
bcs @f
rte
@@: move.l #@stereo_keyon2,TIMERD_VECTOR
rte
;----------------------------------------------------------------
KEYON_ENTRY
@stereo_keyon2:
DI
move.b #%0_1_1_1_1_001,OPMDAT ;C2=1,M2=1,C1=1,M1=1(CH2)
move.l #@stereo_keyon6,TIMERD_VECTOR
rte
KEYON_ENTRY
@stereo_keyon6:
DI
move.b #%0_1_1_1_1_101,OPMDAT ;C2=1,M2=1,C1=1,M1=1(CH6)
move.w #KEYON_INTERVAL2-2-1,counter
move.l #@stereo_phase2to3,TIMERD_VECTOR
rte
KEYON_ENTRY
@stereo_phase2to3:
DI
subq.w #1,counter
bcs @f
rte
@@: move.l #@stereo_keyon3,TIMERD_VECTOR
rte
;----------------------------------------------------------------
KEYON_ENTRY
@stereo_keyon3:
DI
move.b #%0_1_1_1_1_010,OPMDAT ;C2=1,M2=1,C1=1,M1=1(CH3)
move.l #@stereo_keyon7,TIMERD_VECTOR
rte
KEYON_ENTRY
@stereo_keyon7:
DI
move.b #%0_1_1_1_1_110,OPMDAT ;C2=1,M2=1,C1=1,M1=1(CH7)
move.w #KEYON_INTERVAL3-2-1,counter
move.l #@stereo_phase3to4,TIMERD_VECTOR
rte
KEYON_ENTRY
@stereo_phase3to4:
DI
subq.w #1,counter
bcs @f
rte
@@: move.l #@stereo_keyon4,TIMERD_VECTOR
rte
;----------------------------------------------------------------
KEYON_ENTRY
@stereo_keyon4:
DI
move.b #%0_1_1_1_1_011,OPMDAT ;C2=1,M2=1,C1=1,M1=1(CH4)
move.l #@stereo_keyon8,TIMERD_VECTOR
rte
KEYON_ENTRY
@stereo_keyon8:
DI
move.b #%0_1_1_1_1_111,OPMDAT ;C2=1,M2=1,C1=1,M1=1(CH8)
move.w #KEYON_INTERVAL4-2-1,counter
move.l #@stereo_phase4to1,TIMERD_VECTOR
rte
KEYON_ENTRY
@stereo_phase4to1:
DI
subq.w #1,counter
bcs @f
rte
@@: SETUP_MOVEW_IMM STANDBY_DELAY_0,counter
move.l #@stereo_standby,TIMERD_VECTOR
move.b timerd_count,TDDR ;TIMERD割り込み間隔を変更する
rte
KEYON_ENTRY
@stereo_standby:
TIMERD_DI
subq.w #1,counter
bcs @f
rte
@@: move.b #0,TCDR ;TIMERCカウンタ初期化
move.w #(-DELTA_TIMERC).and.$FFFF,delta_timerc
SETUP_MOVEW_IMM INTERVAL_STEREO_0,counter
move.l #@stereo1_play_15,TIMERD_VECTOR
rte
;----------------------------------------------------------------
;カウンタがオーバーフローするまでleft,rightの順に交互に出力する
;スピードレートの調整はleftのみで行う
;スピードレートの調整に伴うデータの採取の延期はleft/right共に1データ分
;カウントはrightのみで行う
;データにない0を挟んだ直後は必ず発音する
STEREO_ENTRY
@stereo1_start_15:
TIMERD_DI
VISUAL 1,0
stereo_left_play $78,a0 ;(CH1C2)TL
move.l #@stereo1_play_51,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo1_play_53,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo1_start_35:
TIMERD_DI
VISUAL 1,0
stereo_left_play $7A,a0 ;(CH3C2)TL
move.l #@stereo1_play_53,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo1_play_51,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo1_start_17:
TIMERD_DI
VISUAL 1,0
stereo_left_play $78,a0 ;(CH1C2)TL
move.l #@stereo1_play_71,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo1_play_73,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo1_start_37:
TIMERD_DI
VISUAL 1,0
stereo_left_play $7A,a0 ;(CH3C2)TL
move.l #@stereo1_play_73,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo1_play_71,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo1_play_15:
TIMERD_DI
VISUAL 1,0
stereo_left_play $78,a0 ;(CH1C2)TL
move.l #@stereo1_play_51,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo1_play_53,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo1_play_35:
TIMERD_DI
VISUAL 1,0
stereo_left_play $7A,a0 ;(CH3C2)TL
move.l #@stereo1_play_53,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo1_play_51,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo1_play_17:
TIMERD_DI
VISUAL 1,0
stereo_left_play $78,a0 ;(CH1C2)TL
move.l #@stereo1_play_71,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo1_play_73,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo1_play_37:
TIMERD_DI
VISUAL 1,0
stereo_left_play $7A,a0 ;(CH3C2)TL
move.l #@stereo1_play_73,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo1_play_71,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo1_play_51:
TIMERD_DI
VISUAL 1,0
stereo_right_play $7C,a0 ;(CH5C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo1_play_15,TIMERD_VECTOR
rte
@@: SETUP_MOVEW_IMM MUTE_STEREO_DELAY_0,counter
move.l #@stereo1_ext_15,TIMERD_VECTOR
rte
stereo_right_over a0
subq.w #1,counter
bcs @f
move.l #@stereo1_play_17,TIMERD_VECTOR
rte
@@: SETUP_MOVEW_IMM MUTE_STEREO_DELAY_0,counter
move.l #@stereo1_ext_17,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo1_play_71:
TIMERD_DI
VISUAL 1,0
stereo_right_play $7E,a0 ;(CH7C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo1_play_17,TIMERD_VECTOR
rte
@@: SETUP_MOVEW_IMM MUTE_STEREO_DELAY_0,counter
move.l #@stereo1_ext_17,TIMERD_VECTOR
rte
stereo_right_over a0
subq.w #1,counter
bcs @f
move.l #@stereo1_play_15,TIMERD_VECTOR
rte
@@: SETUP_MOVEW_IMM MUTE_STEREO_DELAY_0,counter
move.l #@stereo1_ext_15,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo1_play_53:
TIMERD_DI
VISUAL 1,0
stereo_right_play $7C,a0 ;(CH5C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo1_play_35,TIMERD_VECTOR
rte
@@: SETUP_MOVEW_IMM MUTE_STEREO_DELAY_0,counter
move.l #@stereo1_ext_35,TIMERD_VECTOR
rte
stereo_right_over a0
subq.w #1,counter
bcs @f
move.l #@stereo1_play_37,TIMERD_VECTOR
rte
@@: SETUP_MOVEW_IMM MUTE_STEREO_DELAY_0,counter
move.l #@stereo1_ext_37,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo1_play_73:
TIMERD_DI
VISUAL 1,0
stereo_right_play $7E,a0 ;(CH7C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo1_play_37,TIMERD_VECTOR
rte
@@: SETUP_MOVEW_IMM MUTE_STEREO_DELAY_0,counter
move.l #@stereo1_ext_37,TIMERD_VECTOR
rte
stereo_right_over a0
subq.w #1,counter
bcs @f
move.l #@stereo1_play_35,TIMERD_VECTOR
rte
@@: SETUP_MOVEW_IMM MUTE_STEREO_DELAY_0,counter
move.l #@stereo1_ext_35,TIMERD_VECTOR
rte
;カウンタがオーバーフローしたので,left/rightそれぞれ0が出てくるまで待ち,
;0が出てきたら個々に次のchに遷移する
;0が出てこなくてもカウンタがオーバーフローしたら強制的に次のchに遷移する
;カウントはrightのみで行う
;まだleft/right共に0が出てきていない
STEREO_ENTRY
@stereo1_ext_15:
TIMERD_DI
VISUAL 1,1
stereo_left_play $78,a0 ;(CH1C2)TL
move.l #@stereo1_ext_51,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo1_ext_54,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo1_ext_35:
TIMERD_DI
VISUAL 1,1
stereo_left_play $7A,a0 ;(CH3C2)TL
move.l #@stereo1_ext_53,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo1_ext_52,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo1_ext_17:
TIMERD_DI
VISUAL 1,1
stereo_left_play $78,a0 ;(CH1C2)TL
move.l #@stereo1_ext_71,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo1_ext_74,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo1_ext_37:
TIMERD_DI
VISUAL 1,1
stereo_left_play $7A,a0 ;(CH3C2)TL
move.l #@stereo1_ext_73,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo1_ext_72,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo1_ext_51:
TIMERD_DI
VISUAL 1,1
stereo_right_play $7C,a0 ;(CH5C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo1_ext_15,TIMERD_VECTOR
rte
@@: move.l #@stereo1_mute_15,TIMERD_VECTOR
rte
stereo_right_over a0
subq.w #1,counter
bcs @f
move.l #@stereo1_ext_17,TIMERD_VECTOR
rte
@@: move.l #@stereo1_mute_18,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo1_ext_71:
TIMERD_DI
VISUAL 1,1
stereo_right_play $7E,a0 ;(CH7C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo1_ext_17,TIMERD_VECTOR
rte
@@: move.l #@stereo1_mute_17,TIMERD_VECTOR
rte
stereo_right_over a0
subq.w #1,counter
bcs @f
move.l #@stereo1_ext_15,TIMERD_VECTOR
rte
@@: move.l #@stereo1_mute_16,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo1_ext_53:
TIMERD_DI
VISUAL 1,1
stereo_right_play $7C,a0 ;(CH5C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo1_ext_35,TIMERD_VECTOR
rte
@@: move.l #@stereo1_mute_35,TIMERD_VECTOR
rte
stereo_right_over a0
subq.w #1,counter
bcs @f
move.l #@stereo1_ext_37,TIMERD_VECTOR
rte
@@: move.l #@stereo1_mute_38,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo1_ext_73:
TIMERD_DI
VISUAL 1,1
stereo_right_play $7E,a0 ;(CH7C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo1_ext_37,TIMERD_VECTOR
rte
@@: move.l #@stereo1_mute_37,TIMERD_VECTOR
rte
stereo_right_over a0
subq.w #1,counter
bcs @f
move.l #@stereo1_ext_35,TIMERD_VECTOR
rte
@@: move.l #@stereo1_mute_36,TIMERD_VECTOR
rte
;leftだけ0が出てきて次のchに遷移した
;rightに0が出てきたら次のchに遷移する
STEREO_ENTRY
@stereo1_ext_25:
TIMERD_DI
VISUAL 1,1
stereo_left_play $79,a0 ;(CH2C2)TL
move.l #@stereo1_ext_52,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo1_ext_54,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo1_ext_45:
TIMERD_DI
VISUAL 1,1
stereo_left_play $7B,a0 ;(CH4C2)TL
move.l #@stereo1_ext_54,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo1_ext_52,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo1_ext_27:
TIMERD_DI
VISUAL 1,1
stereo_left_play $79,a0 ;(CH2C2)TL
move.l #@stereo1_ext_72,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo1_ext_74,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo1_ext_47:
TIMERD_DI
VISUAL 1,1
stereo_left_play $7B,a0 ;(CH4C2)TL
move.l #@stereo1_ext_74,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo1_ext_72,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo1_ext_52:
TIMERD_DI
VISUAL 1,1
stereo_right_play $7C,a0 ;(CH5C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo1_ext_25,TIMERD_VECTOR
rte
@@: move.l #@stereo1_mute_25,TIMERD_VECTOR
rte
stereo_right_over a0
SETUP_ADDIW_IMM INTERVAL_STEREO_2,counter
move.l #@stereo2_play_28,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo1_ext_72:
TIMERD_DI
VISUAL 1,1
stereo_right_play $7E,a0 ;(CH7C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo1_ext_27,TIMERD_VECTOR
rte
@@: move.l #@stereo1_mute_27,TIMERD_VECTOR
rte
stereo_right_over a0
SETUP_ADDIW_IMM INTERVAL_STEREO_2,counter
move.l #@stereo2_play_26,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo1_ext_54:
TIMERD_DI
VISUAL 1,1
stereo_right_play $7C,a0 ;(CH5C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo1_ext_45,TIMERD_VECTOR
rte
@@: move.l #@stereo1_mute_45,TIMERD_VECTOR
rte
stereo_right_over a0
SETUP_ADDIW_IMM INTERVAL_STEREO_2,counter
move.l #@stereo2_play_48,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo1_ext_74:
TIMERD_DI
VISUAL 1,1
stereo_right_play $7E,a0 ;(CH7C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo1_ext_47,TIMERD_VECTOR
rte
@@: move.l #@stereo1_mute_47,TIMERD_VECTOR
rte
stereo_right_over a0
SETUP_ADDIW_IMM INTERVAL_STEREO_2,counter
move.l #@stereo2_play_46,TIMERD_VECTOR
rte
;rightだけ0が出てきて次のchに遷移した
;leftに0が出てきたら次のchに遷移する
STEREO_ENTRY
@stereo1_ext_16:
TIMERD_DI
VISUAL 1,1
stereo_left_play $78,a0 ;(CH1C2)TL
move.l #@stereo1_ext_61,TIMERD_VECTOR
rte
stereo_left_over a0
SETUP_ADDIW_IMM INTERVAL_STEREO_2,counter
move.l #@stereo2_play_64,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo1_ext_36:
TIMERD_DI
VISUAL 1,1
stereo_left_play $7A,a0 ;(CH3C2)TL
move.l #@stereo1_ext_63,TIMERD_VECTOR
rte
stereo_left_over a0
SETUP_ADDIW_IMM INTERVAL_STEREO_2,counter
move.l #@stereo2_play_62,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo1_ext_18:
TIMERD_DI
VISUAL 1,1
stereo_left_play $78,a0 ;(CH1C2)TL
move.l #@stereo1_ext_81,TIMERD_VECTOR
rte
stereo_left_over a0
SETUP_ADDIW_IMM INTERVAL_STEREO_2,counter
move.l #@stereo2_play_84,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo1_ext_38:
TIMERD_DI
VISUAL 1,1
stereo_left_play $7A,a0 ;(CH3C2)TL
move.l #@stereo1_ext_83,TIMERD_VECTOR
rte
stereo_left_over a0
SETUP_ADDIW_IMM INTERVAL_STEREO_2,counter
move.l #@stereo2_play_82,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo1_ext_61:
TIMERD_DI
VISUAL 1,1
stereo_right_play $7D,a0 ;(CH6C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo1_ext_16,TIMERD_VECTOR
rte
@@: move.l #@stereo1_mute_16,TIMERD_VECTOR
rte
stereo_right_over a0
subq.w #1,counter
bcs @f
move.l #@stereo1_ext_18,TIMERD_VECTOR
rte
@@: move.l #@stereo1_mute_18,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo1_ext_81:
TIMERD_DI
VISUAL 1,1
stereo_right_play $7F,a0 ;(CH8C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo1_ext_18,TIMERD_VECTOR
rte
@@: move.l #@stereo1_mute_18,TIMERD_VECTOR
rte
stereo_right_over a0
subq.w #1,counter
bcs @f
move.l #@stereo1_ext_16,TIMERD_VECTOR
rte
@@: move.l #@stereo1_mute_16,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo1_ext_63:
TIMERD_DI
VISUAL 1,1
stereo_right_play $7D,a0 ;(CH6C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo1_ext_36,TIMERD_VECTOR
rte
@@: move.l #@stereo1_mute_36,TIMERD_VECTOR
rte
stereo_right_over a0
subq.w #1,counter
bcs @f
move.l #@stereo1_ext_38,TIMERD_VECTOR
rte
@@: move.l #@stereo1_mute_38,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo1_ext_83:
TIMERD_DI
VISUAL 1,1
stereo_right_play $7F,a0 ;(CH8C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo1_ext_38,TIMERD_VECTOR
rte
@@: move.l #@stereo1_mute_38,TIMERD_VECTOR
rte
stereo_right_over a0
subq.w #1,counter
bcs @f
move.l #@stereo1_ext_36,TIMERD_VECTOR
rte
@@: move.l #@stereo1_mute_36,TIMERD_VECTOR
rte
;left/right共に0が出てこないままカウンタがオーバーフローした
;left/right共にmuteしてchを遷移する
STEREO_ENTRY
@stereo1_mute_15:
TIMERD_DI
VISUAL 1,3
move.b #$78,OPMADR ;(CH1C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
;次の割り込みに間に合わなくても最短時間で切り換える
OPMDAT_WAIT
stereo_left_play $79,a0 ;(CH2C2)TL
move.l #@stereo1_mute_52,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo1_mute_54,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo1_mute_35:
TIMERD_DI
VISUAL 1,3
move.b #$7A,OPMADR ;(CH3C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
;次の割り込みに間に合わなくても最短時間で切り換える
OPMDAT_WAIT
stereo_left_play $7B,a0 ;(CH4C2)TL
move.l #@stereo1_mute_54,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo1_mute_52,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo1_mute_17:
TIMERD_DI
VISUAL 1,3
move.b #$78,OPMADR ;(CH1C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
;次の割り込みに間に合わなくても最短時間で切り換える
OPMDAT_WAIT
stereo_left_play $79,a0 ;(CH2C2)TL
move.l #@stereo1_mute_72,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo1_mute_74,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo1_mute_37:
TIMERD_DI
VISUAL 1,3
move.b #$7A,OPMADR ;(CH3C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
;次の割り込みに間に合わなくても最短時間で切り換える
OPMDAT_WAIT
stereo_left_play $7B,a0 ;(CH4C2)TL
move.l #@stereo1_mute_74,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo1_mute_72,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo1_mute_54:
TIMERD_DI
VISUAL 1,3
OPMDAT_WAIT ;念のため
move.b #$7C,OPMADR ;(CH5C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
;次の割り込みに間に合わなくても最短時間で切り換える
OPMDAT_WAIT
stereo_right_play $7D,a0 ;(CH6C2)TL
SETUP_MOVEW_IMM INTERVAL_STEREO_1,counter
move.l #@stereo2_play_46,TIMERD_VECTOR
rte
stereo_right_over a0
SETUP_MOVEW_IMM INTERVAL_STEREO_1,counter
move.l #@stereo2_play_48,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo1_mute_74:
TIMERD_DI
VISUAL 1,3
OPMDAT_WAIT ;念のため
move.b #$7E,OPMADR ;(CH7C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
;次の割り込みに間に合わなくても最短時間で切り換える
OPMDAT_WAIT
stereo_right_play $7F,a0 ;(CH8C2)TL
SETUP_MOVEW_IMM INTERVAL_STEREO_1,counter
move.l #@stereo2_play_48,TIMERD_VECTOR
rte
stereo_right_over a0
SETUP_MOVEW_IMM INTERVAL_STEREO_1,counter
move.l #@stereo2_play_46,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo1_mute_52:
TIMERD_DI
VISUAL 1,3
OPMDAT_WAIT ;念のため
move.b #$7C,OPMADR ;(CH5C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
;次の割り込みに間に合わなくても最短時間で切り換える
OPMDAT_WAIT
stereo_right_play $7D,a0 ;(CH6C2)TL
SETUP_MOVEW_IMM INTERVAL_STEREO_1,counter
move.l #@stereo2_play_26,TIMERD_VECTOR
rte
stereo_right_over a0
SETUP_MOVEW_IMM INTERVAL_STEREO_1,counter
move.l #@stereo2_play_28,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo1_mute_72:
TIMERD_DI
VISUAL 1,3
OPMDAT_WAIT ;念のため
move.b #$7E,OPMADR ;(CH7C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
;次の割り込みに間に合わなくても最短時間で切り換える
OPMDAT_WAIT
stereo_right_play $7F,a0 ;(CH8C2)TL
SETUP_MOVEW_IMM INTERVAL_STEREO_1,counter
move.l #@stereo2_play_28,TIMERD_VECTOR
rte
stereo_right_over a0
SETUP_MOVEW_IMM INTERVAL_STEREO_1,counter
move.l #@stereo2_play_26,TIMERD_VECTOR
rte
;leftだけ0が出てこないままカウンタがオーバーフローした
;leftだけmuteしてchを遷移する
STEREO_ENTRY
@stereo1_mute_16:
TIMERD_DI
VISUAL 1,2
move.b #$78,OPMADR ;(CH1C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
SETUP_MOVEW_IMM INTERVAL_STEREO_2,counter
move.l #@stereo2_start_26,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo1_mute_36:
TIMERD_DI
VISUAL 1,2
move.b #$7A,OPMADR ;(CH3C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
SETUP_MOVEW_IMM INTERVAL_STEREO_2,counter
move.l #@stereo2_start_46,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo1_mute_18:
TIMERD_DI
VISUAL 1,2
move.b #$78,OPMADR ;(CH1C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
SETUP_MOVEW_IMM INTERVAL_STEREO_2,counter
move.l #@stereo2_start_28,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo1_mute_38:
TIMERD_DI
VISUAL 1,2
move.b #$7A,OPMADR ;(CH3C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
SETUP_MOVEW_IMM INTERVAL_STEREO_2,counter
move.l #@stereo2_start_48,TIMERD_VECTOR
rte
;rightだけ0が出てこないままカウンタがオーバーフローした
;rightだけmuteしてchを遷移する
STEREO_ENTRY
@stereo1_mute_25:
TIMERD_DI
VISUAL 1,4
stereo_left_play $79,a0 ;(CH2C2)TL
move.l #@stereo1_mute_62,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo1_mute_64,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo1_mute_45:
TIMERD_DI
VISUAL 1,4
stereo_left_play $7B,a0 ;(CH4C2)TL
move.l #@stereo1_mute_64,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo1_mute_62,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo1_mute_27:
TIMERD_DI
VISUAL 1,4
stereo_left_play $79,a0 ;(CH2C2)TL
move.l #@stereo1_mute_82,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo1_mute_84,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo1_mute_47:
TIMERD_DI
VISUAL 1,4
stereo_left_play $7B,a0 ;(CH4C2)TL
move.l #@stereo1_mute_84,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo1_mute_82,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo1_mute_62:
TIMERD_DI
VISUAL 1,4
move.b #$7C,OPMADR ;(CH5C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
;次の割り込みに間に合わなくても最短時間で切り換える
OPMDAT_WAIT
stereo_right_play $7D,a0 ;(CH6C2)TL
SETUP_ADDIW_IMM INTERVAL_STEREO_1,counter
move.l #@stereo2_play_26,TIMERD_VECTOR
rte
stereo_right_over a0
SETUP_ADDIW_IMM INTERVAL_STEREO_1,counter
move.l #@stereo2_play_28,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo1_mute_82:
TIMERD_DI
VISUAL 1,4
move.b #$7E,OPMADR ;(CH7C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
;次の割り込みに間に合わなくても最短時間で切り換える
OPMDAT_WAIT
stereo_right_play $7F,a0 ;(CH8C2)TL
SETUP_ADDIW_IMM INTERVAL_STEREO_1,counter
move.l #@stereo2_play_28,TIMERD_VECTOR
rte
stereo_right_over a0
SETUP_ADDIW_IMM INTERVAL_STEREO_1,counter
move.l #@stereo2_play_26,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo1_mute_64:
TIMERD_DI
VISUAL 1,4
move.b #$7C,OPMADR ;(CH5C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
;次の割り込みに間に合わなくても最短時間で切り換える
OPMDAT_WAIT
stereo_right_play $7D,a0 ;(CH6C2)TL
SETUP_ADDIW_IMM INTERVAL_STEREO_1,counter
move.l #@stereo2_play_46,TIMERD_VECTOR
rte
stereo_right_over a0
SETUP_ADDIW_IMM INTERVAL_STEREO_1,counter
move.l #@stereo2_play_48,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo1_mute_84:
TIMERD_DI
VISUAL 1,4
move.b #$7E,OPMADR ;(CH7C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
;次の割り込みに間に合わなくても最短時間で切り換える
OPMDAT_WAIT
stereo_right_play $7F,a0 ;(CH8C2)TL
SETUP_ADDIW_IMM INTERVAL_STEREO_1,counter
move.l #@stereo2_play_48,TIMERD_VECTOR
rte
stereo_right_over a0
SETUP_ADDIW_IMM INTERVAL_STEREO_1,counter
move.l #@stereo2_play_46,TIMERD_VECTOR
rte
;----------------------------------------------------------------
;カウンタがオーバーフローするまでleft,rightの順に交互に出力する
;スピードレートの調整はleftのみで行う
;スピードレートの調整に伴うデータの採取の延期はleft/right共に1データ分
;カウントはrightのみで行う
;データにない0を挟んだ直後は必ず発音する
STEREO_ENTRY
@stereo2_start_26:
TIMERD_DI
VISUAL 2,0
stereo_left_play $79,a0 ;(CH2C2)TL
move.l #@stereo2_play_62,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo2_play_64,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo2_start_46:
TIMERD_DI
VISUAL 2,0
stereo_left_play $7B,a0 ;(CH4C2)TL
move.l #@stereo2_play_64,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo2_play_62,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo2_start_28:
TIMERD_DI
VISUAL 2,0
stereo_left_play $79,a0 ;(CH2C2)TL
move.l #@stereo2_play_82,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo2_play_84,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo2_start_48:
TIMERD_DI
VISUAL 2,0
stereo_left_play $7B,a0 ;(CH4C2)TL
move.l #@stereo2_play_84,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo2_play_82,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo2_play_26:
TIMERD_DI
VISUAL 2,0
stereo_left_play $79,a0 ;(CH2C2)TL
move.l #@stereo2_play_62,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo2_play_64,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo2_play_46:
TIMERD_DI
VISUAL 2,0
stereo_left_play $7B,a0 ;(CH4C2)TL
move.l #@stereo2_play_64,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo2_play_62,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo2_play_28:
TIMERD_DI
VISUAL 2,0
stereo_left_play $79,a0 ;(CH2C2)TL
move.l #@stereo2_play_82,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo2_play_84,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo2_play_48:
TIMERD_DI
VISUAL 2,0
stereo_left_play $7B,a0 ;(CH4C2)TL
move.l #@stereo2_play_84,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo2_play_82,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo2_play_62:
TIMERD_DI
VISUAL 2,0
stereo_right_play $7D,a0 ;(CH6C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo2_play_26,TIMERD_VECTOR
rte
@@: SETUP_MOVEW_IMM MUTE_STEREO_DELAY_0,counter
move.l #@stereo2_ext_26,TIMERD_VECTOR
rte
stereo_right_over a0
subq.w #1,counter
bcs @f
move.l #@stereo2_play_28,TIMERD_VECTOR
rte
@@: SETUP_MOVEW_IMM MUTE_STEREO_DELAY_0,counter
move.l #@stereo2_ext_28,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo2_play_82:
TIMERD_DI
VISUAL 2,0
stereo_right_play $7F,a0 ;(CH8C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo2_play_28,TIMERD_VECTOR
rte
@@: SETUP_MOVEW_IMM MUTE_STEREO_DELAY_0,counter
move.l #@stereo2_ext_28,TIMERD_VECTOR
rte
stereo_right_over a0
subq.w #1,counter
bcs @f
move.l #@stereo2_play_26,TIMERD_VECTOR
rte
@@: SETUP_MOVEW_IMM MUTE_STEREO_DELAY_0,counter
move.l #@stereo2_ext_26,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo2_play_64:
TIMERD_DI
VISUAL 2,0
stereo_right_play $7D,a0 ;(CH6C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo2_play_46,TIMERD_VECTOR
rte
@@: SETUP_MOVEW_IMM MUTE_STEREO_DELAY_0,counter
move.l #@stereo2_ext_46,TIMERD_VECTOR
rte
stereo_right_over a0
subq.w #1,counter
bcs @f
move.l #@stereo2_play_48,TIMERD_VECTOR
rte
@@: SETUP_MOVEW_IMM MUTE_STEREO_DELAY_0,counter
move.l #@stereo2_ext_48,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo2_play_84:
TIMERD_DI
VISUAL 2,0
stereo_right_play $7F,a0 ;(CH8C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo2_play_48,TIMERD_VECTOR
rte
@@: SETUP_MOVEW_IMM MUTE_STEREO_DELAY_0,counter
move.l #@stereo2_ext_48,TIMERD_VECTOR
rte
stereo_right_over a0
subq.w #1,counter
bcs @f
move.l #@stereo2_play_46,TIMERD_VECTOR
rte
@@: SETUP_MOVEW_IMM MUTE_STEREO_DELAY_0,counter
move.l #@stereo2_ext_46,TIMERD_VECTOR
rte
;カウンタがオーバーフローしたので,left/rightそれぞれ0が出てくるまで待ち,
;0が出てきたら個々に次のchに遷移する
;0が出てこなくてもカウンタがオーバーフローしたら強制的に次のchに遷移する
;カウントはrightのみで行う
;まだleft/right共に0が出てきていない
STEREO_ENTRY
@stereo2_ext_26:
TIMERD_DI
VISUAL 2,1
stereo_left_play $79,a0 ;(CH2C2)TL
move.l #@stereo2_ext_62,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo2_ext_61,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo2_ext_46:
TIMERD_DI
VISUAL 2,1
stereo_left_play $7B,a0 ;(CH4C2)TL
move.l #@stereo2_ext_64,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo2_ext_63,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo2_ext_28:
TIMERD_DI
VISUAL 2,1
stereo_left_play $79,a0 ;(CH2C2)TL
move.l #@stereo2_ext_82,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo2_ext_81,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo2_ext_48:
TIMERD_DI
VISUAL 2,1
stereo_left_play $7B,a0 ;(CH4C2)TL
move.l #@stereo2_ext_84,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo2_ext_83,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo2_ext_62:
TIMERD_DI
VISUAL 2,1
stereo_right_play $7D,a0 ;(CH6C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo2_ext_26,TIMERD_VECTOR
rte
@@: move.l #@stereo2_mute_26,TIMERD_VECTOR
rte
stereo_right_over a0
subq.w #1,counter
bcs @f
move.l #@stereo2_ext_28,TIMERD_VECTOR
rte
@@: move.l #@stereo2_mute_25,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo2_ext_82:
TIMERD_DI
VISUAL 2,1
stereo_right_play $7F,a0 ;(CH8C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo2_ext_28,TIMERD_VECTOR
rte
@@: move.l #@stereo2_mute_28,TIMERD_VECTOR
rte
stereo_right_over a0
subq.w #1,counter
bcs @f
move.l #@stereo2_ext_26,TIMERD_VECTOR
rte
@@: move.l #@stereo2_mute_27,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo2_ext_64:
TIMERD_DI
VISUAL 2,1
stereo_right_play $7D,a0 ;(CH6C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo2_ext_46,TIMERD_VECTOR
rte
@@: move.l #@stereo2_mute_46,TIMERD_VECTOR
rte
stereo_right_over a0
subq.w #1,counter
bcs @f
move.l #@stereo2_ext_48,TIMERD_VECTOR
rte
@@: move.l #@stereo2_mute_45,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo2_ext_84:
TIMERD_DI
VISUAL 2,1
stereo_right_play $7F,a0 ;(CH8C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo2_ext_48,TIMERD_VECTOR
rte
@@: move.l #@stereo2_mute_48,TIMERD_VECTOR
rte
stereo_right_over a0
subq.w #1,counter
bcs @f
move.l #@stereo2_ext_46,TIMERD_VECTOR
rte
@@: move.l #@stereo2_mute_47,TIMERD_VECTOR
rte
;leftだけ0が出てきて次のchに遷移した
;rightに0が出てきたら次のchに遷移する
STEREO_ENTRY
@stereo2_ext_36:
TIMERD_DI
VISUAL 2,1
stereo_left_play $7A,a0 ;(CH3C2)TL
move.l #@stereo2_ext_63,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo2_ext_61,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo2_ext_16:
TIMERD_DI
VISUAL 2,1
stereo_left_play $78,a0 ;(CH1C2)TL
move.l #@stereo2_ext_61,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo2_ext_63,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo2_ext_38:
TIMERD_DI
VISUAL 2,1
stereo_left_play $7A,a0 ;(CH3C2)TL
move.l #@stereo2_ext_83,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo2_ext_81,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo2_ext_18:
TIMERD_DI
VISUAL 2,1
stereo_left_play $78,a0 ;(CH1C2)TL
move.l #@stereo2_ext_81,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo2_ext_83,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo2_ext_63:
TIMERD_DI
VISUAL 2,1
stereo_right_play $7D,a0 ;(CH6C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo2_ext_36,TIMERD_VECTOR
rte
@@: move.l #@stereo2_mute_36,TIMERD_VECTOR
rte
stereo_right_over a0
SETUP_ADDIW_IMM INTERVAL_STEREO_2,counter
move.l #@stereo3_play_35,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo2_ext_83:
TIMERD_DI
VISUAL 2,1
stereo_right_play $7F,a0 ;(CH8C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo2_ext_38,TIMERD_VECTOR
rte
@@: move.l #@stereo2_mute_38,TIMERD_VECTOR
rte
stereo_right_over a0
SETUP_ADDIW_IMM INTERVAL_STEREO_2,counter
move.l #@stereo3_play_37,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo2_ext_61:
TIMERD_DI
VISUAL 2,1
stereo_right_play $7D,a0 ;(CH6C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo2_ext_16,TIMERD_VECTOR
rte
@@: move.l #@stereo2_mute_16,TIMERD_VECTOR
rte
stereo_right_over a0
SETUP_ADDIW_IMM INTERVAL_STEREO_2,counter
move.l #@stereo3_play_15,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo2_ext_81:
TIMERD_DI
VISUAL 2,1
stereo_right_play $7F,a0 ;(CH8C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo2_ext_18,TIMERD_VECTOR
rte
@@: move.l #@stereo2_mute_18,TIMERD_VECTOR
rte
stereo_right_over a0
SETUP_ADDIW_IMM INTERVAL_STEREO_2,counter
move.l #@stereo3_play_17,TIMERD_VECTOR
rte
;rightだけ0が出てきて次のchに遷移した
;leftに0が出てきたら次のchに遷移する
STEREO_ENTRY
@stereo2_ext_27:
TIMERD_DI
VISUAL 2,1
stereo_left_play $79,a0 ;(CH2C2)TL
move.l #@stereo2_ext_72,TIMERD_VECTOR
rte
stereo_left_over a0
SETUP_ADDIW_IMM INTERVAL_STEREO_2,counter
move.l #@stereo3_play_71,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo2_ext_47:
TIMERD_DI
VISUAL 2,1
stereo_left_play $7B,a0 ;(CH4C2)TL
move.l #@stereo2_ext_74,TIMERD_VECTOR
rte
stereo_left_over a0
SETUP_ADDIW_IMM INTERVAL_STEREO_2,counter
move.l #@stereo3_play_73,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo2_ext_25:
TIMERD_DI
VISUAL 2,1
stereo_left_play $79,a0 ;(CH2C2)TL
move.l #@stereo2_ext_52,TIMERD_VECTOR
rte
stereo_left_over a0
SETUP_ADDIW_IMM INTERVAL_STEREO_2,counter
move.l #@stereo3_play_51,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo2_ext_45:
TIMERD_DI
VISUAL 2,1
stereo_left_play $7B,a0 ;(CH4C2)TL
move.l #@stereo2_ext_54,TIMERD_VECTOR
rte
stereo_left_over a0
SETUP_ADDIW_IMM INTERVAL_STEREO_2,counter
move.l #@stereo3_play_53,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo2_ext_72:
TIMERD_DI
VISUAL 2,1
stereo_right_play $7E,a0 ;(CH7C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo2_ext_27,TIMERD_VECTOR
rte
@@: move.l #@stereo2_mute_27,TIMERD_VECTOR
rte
stereo_right_over a0
subq.w #1,counter
bcs @f
move.l #@stereo2_ext_25,TIMERD_VECTOR
rte
@@: move.l #@stereo2_mute_25,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo2_ext_52:
TIMERD_DI
VISUAL 2,1
stereo_right_play $7C,a0 ;(CH5C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo2_ext_25,TIMERD_VECTOR
rte
@@: move.l #@stereo2_mute_25,TIMERD_VECTOR
rte
stereo_right_over a0
subq.w #1,counter
bcs @f
move.l #@stereo2_ext_27,TIMERD_VECTOR
rte
@@: move.l #@stereo2_mute_27,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo2_ext_74:
TIMERD_DI
VISUAL 2,1
stereo_right_play $7E,a0 ;(CH7C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo2_ext_47,TIMERD_VECTOR
rte
@@: move.l #@stereo2_mute_47,TIMERD_VECTOR
rte
stereo_right_over a0
subq.w #1,counter
bcs @f
move.l #@stereo2_ext_45,TIMERD_VECTOR
rte
@@: move.l #@stereo2_mute_45,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo2_ext_54:
TIMERD_DI
VISUAL 2,1
stereo_right_play $7C,a0 ;(CH5C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo2_ext_45,TIMERD_VECTOR
rte
@@: move.l #@stereo2_mute_45,TIMERD_VECTOR
rte
stereo_right_over a0
subq.w #1,counter
bcs @f
move.l #@stereo2_ext_47,TIMERD_VECTOR
rte
@@: move.l #@stereo2_mute_47,TIMERD_VECTOR
rte
;left/right共に0が出てこないままカウンタがオーバーフローした
;left/right共にmuteしてchを遷移する
STEREO_ENTRY
@stereo2_mute_26:
TIMERD_DI
VISUAL 2,3
move.b #$79,OPMADR ;(CH2C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
;次の割り込みに間に合わなくても最短時間で切り換える
OPMDAT_WAIT
stereo_left_play $7A,a0 ;(CH3C2)TL
move.l #@stereo2_mute_63,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo2_mute_61,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo2_mute_46:
TIMERD_DI
VISUAL 2,3
move.b #$7B,OPMADR ;(CH4C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
;次の割り込みに間に合わなくても最短時間で切り換える
OPMDAT_WAIT
stereo_left_play $78,a0 ;(CH1C2)TL
move.l #@stereo2_mute_61,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo2_mute_63,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo2_mute_28:
TIMERD_DI
VISUAL 2,3
move.b #$79,OPMADR ;(CH2C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
;次の割り込みに間に合わなくても最短時間で切り換える
OPMDAT_WAIT
stereo_left_play $7A,a0 ;(CH3C2)TL
move.l #@stereo2_mute_83,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo2_mute_81,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo2_mute_48:
TIMERD_DI
VISUAL 2,3
move.b #$7B,OPMADR ;(CH4C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
;次の割り込みに間に合わなくても最短時間で切り換える
OPMDAT_WAIT
stereo_left_play $78,a0 ;(CH1C2)TL
move.l #@stereo2_mute_81,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo2_mute_83,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo2_mute_61:
TIMERD_DI
VISUAL 2,3
OPMDAT_WAIT ;念のため
move.b #$7D,OPMADR ;(CH6C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
;次の割り込みに間に合わなくても最短時間で切り換える
OPMDAT_WAIT
stereo_right_play $7E,a0 ;(CH7C2)TL
SETUP_MOVEW_IMM INTERVAL_STEREO_1,counter
move.l #@stereo3_play_17,TIMERD_VECTOR
rte
stereo_right_over a0
SETUP_MOVEW_IMM INTERVAL_STEREO_1,counter
move.l #@stereo3_play_15,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo2_mute_81:
TIMERD_DI
VISUAL 2,3
OPMDAT_WAIT ;念のため
move.b #$7F,OPMADR ;(CH8C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
;次の割り込みに間に合わなくても最短時間で切り換える
OPMDAT_WAIT
stereo_right_play $7C,a0 ;(CH5C2)TL
SETUP_MOVEW_IMM INTERVAL_STEREO_1,counter
move.l #@stereo3_play_15,TIMERD_VECTOR
rte
stereo_right_over a0
SETUP_MOVEW_IMM INTERVAL_STEREO_1,counter
move.l #@stereo3_play_17,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo2_mute_63:
TIMERD_DI
VISUAL 2,3
OPMDAT_WAIT ;念のため
move.b #$7D,OPMADR ;(CH6C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
;次の割り込みに間に合わなくても最短時間で切り換える
OPMDAT_WAIT
stereo_right_play $7E,a0 ;(CH7C2)TL
SETUP_MOVEW_IMM INTERVAL_STEREO_1,counter
move.l #@stereo3_play_37,TIMERD_VECTOR
rte
stereo_right_over a0
SETUP_MOVEW_IMM INTERVAL_STEREO_1,counter
move.l #@stereo3_play_35,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo2_mute_83:
TIMERD_DI
VISUAL 2,3
OPMDAT_WAIT ;念のため
move.b #$7F,OPMADR ;(CH8C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
;次の割り込みに間に合わなくても最短時間で切り換える
OPMDAT_WAIT
stereo_right_play $7C,a0 ;(CH5C2)TL
SETUP_MOVEW_IMM INTERVAL_STEREO_1,counter
move.l #@stereo3_play_35,TIMERD_VECTOR
rte
stereo_right_over a0
SETUP_MOVEW_IMM INTERVAL_STEREO_1,counter
move.l #@stereo3_play_37,TIMERD_VECTOR
rte
;leftだけ0が出てこないままカウンタがオーバーフローした
;leftだけmuteしてchを遷移する
STEREO_ENTRY
@stereo2_mute_27:
TIMERD_DI
VISUAL 2,2
move.b #$79,OPMADR ;(CH2C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
SETUP_MOVEW_IMM INTERVAL_STEREO_2,counter
move.l #@stereo3_start_37,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo2_mute_47:
TIMERD_DI
VISUAL 2,2
move.b #$7B,OPMADR ;(CH4C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
SETUP_MOVEW_IMM INTERVAL_STEREO_2,counter
move.l #@stereo3_start_17,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo2_mute_25:
TIMERD_DI
VISUAL 2,2
move.b #$79,OPMADR ;(CH2C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
SETUP_MOVEW_IMM INTERVAL_STEREO_2,counter
move.l #@stereo3_start_35,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo2_mute_45:
TIMERD_DI
VISUAL 2,2
move.b #$7B,OPMADR ;(CH4C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
SETUP_MOVEW_IMM INTERVAL_STEREO_2,counter
move.l #@stereo3_start_15,TIMERD_VECTOR
rte
;rightだけ0が出てこないままカウンタがオーバーフローした
;rightだけmuteしてchを遷移する
STEREO_ENTRY
@stereo2_mute_36:
TIMERD_DI
VISUAL 2,4
stereo_left_play $7A,a0 ;(CH3C2)TL
move.l #@stereo2_mute_73,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo2_mute_71,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo2_mute_16:
TIMERD_DI
VISUAL 2,4
stereo_left_play $78,a0 ;(CH1C2)TL
move.l #@stereo2_mute_71,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo2_mute_73,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo2_mute_38:
TIMERD_DI
VISUAL 2,4
stereo_left_play $7A,a0 ;(CH3C2)TL
move.l #@stereo2_mute_53,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo2_mute_51,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo2_mute_18:
TIMERD_DI
VISUAL 2,4
stereo_left_play $78,a0 ;(CH1C2)TL
move.l #@stereo2_mute_51,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo2_mute_53,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo2_mute_73:
TIMERD_DI
VISUAL 2,4
move.b #$7D,OPMADR ;(CH6C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
;次の割り込みに間に合わなくても最短時間で切り換える
OPMDAT_WAIT
stereo_right_play $7E,a0 ;(CH7C2)TL
SETUP_ADDIW_IMM INTERVAL_STEREO_1,counter
move.l #@stereo3_play_37,TIMERD_VECTOR
rte
stereo_right_over a0
SETUP_ADDIW_IMM INTERVAL_STEREO_1,counter
move.l #@stereo3_play_35,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo2_mute_53:
TIMERD_DI
VISUAL 2,4
move.b #$7F,OPMADR ;(CH8C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
;次の割り込みに間に合わなくても最短時間で切り換える
OPMDAT_WAIT
stereo_right_play $7C,a0 ;(CH5C2)TL
SETUP_ADDIW_IMM INTERVAL_STEREO_1,counter
move.l #@stereo3_play_35,TIMERD_VECTOR
rte
stereo_right_over a0
SETUP_ADDIW_IMM INTERVAL_STEREO_1,counter
move.l #@stereo3_play_37,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo2_mute_71:
TIMERD_DI
VISUAL 2,4
move.b #$7D,OPMADR ;(CH6C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
;次の割り込みに間に合わなくても最短時間で切り換える
OPMDAT_WAIT
stereo_right_play $7E,a0 ;(CH7C2)TL
SETUP_ADDIW_IMM INTERVAL_STEREO_1,counter
move.l #@stereo3_play_17,TIMERD_VECTOR
rte
stereo_right_over a0
SETUP_ADDIW_IMM INTERVAL_STEREO_1,counter
move.l #@stereo3_play_15,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo2_mute_51:
TIMERD_DI
VISUAL 2,4
move.b #$7F,OPMADR ;(CH8C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
;次の割り込みに間に合わなくても最短時間で切り換える
OPMDAT_WAIT
stereo_right_play $7C,a0 ;(CH5C2)TL
SETUP_ADDIW_IMM INTERVAL_STEREO_1,counter
move.l #@stereo3_play_15,TIMERD_VECTOR
rte
stereo_right_over a0
SETUP_ADDIW_IMM INTERVAL_STEREO_1,counter
move.l #@stereo3_play_17,TIMERD_VECTOR
rte
;----------------------------------------------------------------
;カウンタがオーバーフローするまでleft,rightの順に交互に出力する
;スピードレートの調整はleftのみで行う
;スピードレートの調整に伴うデータの採取の延期はleft/right共に1データ分
;カウントはrightのみで行う
;データにない0を挟んだ直後は必ず発音する
STEREO_ENTRY
@stereo3_start_37:
TIMERD_DI
VISUAL 3,0
stereo_left_play $7A,a0 ;(CH3C2)TL
move.l #@stereo3_play_73,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo3_play_71,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo3_start_17:
TIMERD_DI
VISUAL 3,0
stereo_left_play $78,a0 ;(CH1C2)TL
move.l #@stereo3_play_71,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo3_play_73,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo3_start_35:
TIMERD_DI
VISUAL 3,0
stereo_left_play $7A,a0 ;(CH3C2)TL
move.l #@stereo3_play_53,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo3_play_51,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo3_start_15:
TIMERD_DI
VISUAL 3,0
stereo_left_play $78,a0 ;(CH1C2)TL
move.l #@stereo3_play_51,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo3_play_53,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo3_play_37:
TIMERD_DI
VISUAL 3,0
stereo_left_play $7A,a0 ;(CH3C2)TL
move.l #@stereo3_play_73,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo3_play_71,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo3_play_17:
TIMERD_DI
VISUAL 3,0
stereo_left_play $78,a0 ;(CH1C2)TL
move.l #@stereo3_play_71,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo3_play_73,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo3_play_35:
TIMERD_DI
VISUAL 3,0
stereo_left_play $7A,a0 ;(CH3C2)TL
move.l #@stereo3_play_53,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo3_play_51,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo3_play_15:
TIMERD_DI
VISUAL 3,0
stereo_left_play $78,a0 ;(CH1C2)TL
move.l #@stereo3_play_51,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo3_play_53,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo3_play_73:
TIMERD_DI
VISUAL 3,0
stereo_right_play $7E,a0 ;(CH7C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo3_play_37,TIMERD_VECTOR
rte
@@: SETUP_MOVEW_IMM MUTE_STEREO_DELAY_0,counter
move.l #@stereo3_ext_37,TIMERD_VECTOR
rte
stereo_right_over a0
subq.w #1,counter
bcs @f
move.l #@stereo3_play_35,TIMERD_VECTOR
rte
@@: SETUP_MOVEW_IMM MUTE_STEREO_DELAY_0,counter
move.l #@stereo3_ext_35,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo3_play_53:
TIMERD_DI
VISUAL 3,0
stereo_right_play $7C,a0 ;(CH5C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo3_play_35,TIMERD_VECTOR
rte
@@: SETUP_MOVEW_IMM MUTE_STEREO_DELAY_0,counter
move.l #@stereo3_ext_35,TIMERD_VECTOR
rte
stereo_right_over a0
subq.w #1,counter
bcs @f
move.l #@stereo3_play_37,TIMERD_VECTOR
rte
@@: SETUP_MOVEW_IMM MUTE_STEREO_DELAY_0,counter
move.l #@stereo3_ext_37,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo3_play_71:
TIMERD_DI
VISUAL 3,0
stereo_right_play $7E,a0 ;(CH7C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo3_play_17,TIMERD_VECTOR
rte
@@: SETUP_MOVEW_IMM MUTE_STEREO_DELAY_0,counter
move.l #@stereo3_ext_17,TIMERD_VECTOR
rte
stereo_right_over a0
subq.w #1,counter
bcs @f
move.l #@stereo3_play_15,TIMERD_VECTOR
rte
@@: SETUP_MOVEW_IMM MUTE_STEREO_DELAY_0,counter
move.l #@stereo3_ext_15,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo3_play_51:
TIMERD_DI
VISUAL 3,0
stereo_right_play $7C,a0 ;(CH5C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo3_play_15,TIMERD_VECTOR
rte
@@: SETUP_MOVEW_IMM MUTE_STEREO_DELAY_0,counter
move.l #@stereo3_ext_15,TIMERD_VECTOR
rte
stereo_right_over a0
subq.w #1,counter
bcs @f
move.l #@stereo3_play_17,TIMERD_VECTOR
rte
@@: SETUP_MOVEW_IMM MUTE_STEREO_DELAY_0,counter
move.l #@stereo3_ext_17,TIMERD_VECTOR
rte
;カウンタがオーバーフローしたので,left/rightそれぞれ0が出てくるまで待ち,
;0が出てきたら個々に次のchに遷移する
;0が出てこなくてもカウンタがオーバーフローしたら強制的に次のchに遷移する
;カウントはrightのみで行う
;まだleft/right共に0が出てきていない
STEREO_ENTRY
@stereo3_ext_37:
TIMERD_DI
VISUAL 3,1
stereo_left_play $7A,a0 ;(CH3C2)TL
move.l #@stereo3_ext_73,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo3_ext_72,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo3_ext_17:
TIMERD_DI
VISUAL 3,1
stereo_left_play $78,a0 ;(CH1C2)TL
move.l #@stereo3_ext_71,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo3_ext_74,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo3_ext_35:
TIMERD_DI
VISUAL 3,1
stereo_left_play $7A,a0 ;(CH3C2)TL
move.l #@stereo3_ext_53,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo3_ext_52,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo3_ext_15:
TIMERD_DI
VISUAL 3,1
stereo_left_play $78,a0 ;(CH1C2)TL
move.l #@stereo3_ext_51,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo3_ext_54,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo3_ext_73:
TIMERD_DI
VISUAL 3,1
stereo_right_play $7E,a0 ;(CH7C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo3_ext_37,TIMERD_VECTOR
rte
@@: move.l #@stereo3_mute_37,TIMERD_VECTOR
rte
stereo_right_over a0
subq.w #1,counter
bcs @f
move.l #@stereo3_ext_35,TIMERD_VECTOR
rte
@@: move.l #@stereo3_mute_36,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo3_ext_53:
TIMERD_DI
VISUAL 3,1
stereo_right_play $7C,a0 ;(CH5C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo3_ext_35,TIMERD_VECTOR
rte
@@: move.l #@stereo3_mute_35,TIMERD_VECTOR
rte
stereo_right_over a0
subq.w #1,counter
bcs @f
move.l #@stereo3_ext_37,TIMERD_VECTOR
rte
@@: move.l #@stereo3_mute_38,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo3_ext_71:
TIMERD_DI
VISUAL 3,1
stereo_right_play $7E,a0 ;(CH7C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo3_ext_17,TIMERD_VECTOR
rte
@@: move.l #@stereo3_mute_17,TIMERD_VECTOR
rte
stereo_right_over a0
subq.w #1,counter
bcs @f
move.l #@stereo3_ext_15,TIMERD_VECTOR
rte
@@: move.l #@stereo3_mute_16,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo3_ext_51:
TIMERD_DI
VISUAL 3,1
stereo_right_play $7C,a0 ;(CH5C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo3_ext_15,TIMERD_VECTOR
rte
@@: move.l #@stereo3_mute_15,TIMERD_VECTOR
rte
stereo_right_over a0
subq.w #1,counter
bcs @f
move.l #@stereo3_ext_17,TIMERD_VECTOR
rte
@@: move.l #@stereo3_mute_18,TIMERD_VECTOR
rte
;leftだけ0が出てきて次のchに遷移した
;rightに0が出てきたら次のchに遷移する
STEREO_ENTRY
@stereo3_ext_47:
TIMERD_DI
VISUAL 3,1
stereo_left_play $7B,a0 ;(CH4C2)TL
move.l #@stereo3_ext_74,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo3_ext_72,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo3_ext_27:
TIMERD_DI
VISUAL 3,1
stereo_left_play $79,a0 ;(CH2C2)TL
move.l #@stereo3_ext_72,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo3_ext_74,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo3_ext_45:
TIMERD_DI
VISUAL 3,1
stereo_left_play $7B,a0 ;(CH4C2)TL
move.l #@stereo3_ext_54,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo3_ext_52,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo3_ext_25:
TIMERD_DI
VISUAL 3,1
stereo_left_play $79,a0 ;(CH2C2)TL
move.l #@stereo3_ext_52,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo3_ext_54,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo3_ext_74:
TIMERD_DI
VISUAL 3,1
stereo_right_play $7E,a0 ;(CH7C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo3_ext_47,TIMERD_VECTOR
rte
@@: move.l #@stereo3_mute_47,TIMERD_VECTOR
rte
stereo_right_over a0
SETUP_ADDIW_IMM INTERVAL_STEREO_LAST_2,counter
move.l #@stereo4_play_46,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo3_ext_54:
TIMERD_DI
VISUAL 3,1
stereo_right_play $7C,a0 ;(CH5C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo3_ext_45,TIMERD_VECTOR
rte
@@: move.l #@stereo3_mute_45,TIMERD_VECTOR
rte
stereo_right_over a0
SETUP_ADDIW_IMM INTERVAL_STEREO_LAST_2,counter
move.l #@stereo4_play_48,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo3_ext_72:
TIMERD_DI
VISUAL 3,1
stereo_right_play $7E,a0 ;(CH7C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo3_ext_27,TIMERD_VECTOR
rte
@@: move.l #@stereo3_mute_27,TIMERD_VECTOR
rte
stereo_right_over a0
SETUP_ADDIW_IMM INTERVAL_STEREO_LAST_2,counter
move.l #@stereo4_play_26,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo3_ext_52:
TIMERD_DI
VISUAL 3,1
stereo_right_play $7C,a0 ;(CH5C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo3_ext_25,TIMERD_VECTOR
rte
@@: move.l #@stereo3_mute_25,TIMERD_VECTOR
rte
stereo_right_over a0
SETUP_ADDIW_IMM INTERVAL_STEREO_LAST_2,counter
move.l #@stereo4_play_28,TIMERD_VECTOR
rte
;rightだけ0が出てきて次のchに遷移した
;leftに0が出てきたら次のchに遷移する
STEREO_ENTRY
@stereo3_ext_38:
TIMERD_DI
VISUAL 3,1
stereo_left_play $7A,a0 ;(CH3C2)TL
move.l #@stereo3_ext_83,TIMERD_VECTOR
rte
stereo_left_over a0
SETUP_ADDIW_IMM INTERVAL_STEREO_LAST_2,counter
move.l #@stereo4_play_82,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo3_ext_18:
TIMERD_DI
VISUAL 3,1
stereo_left_play $78,a0 ;(CH1C2)TL
move.l #@stereo3_ext_81,TIMERD_VECTOR
rte
stereo_left_over a0
SETUP_ADDIW_IMM INTERVAL_STEREO_LAST_2,counter
move.l #@stereo4_play_84,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo3_ext_36:
TIMERD_DI
VISUAL 3,1
stereo_left_play $7A,a0 ;(CH3C2)TL
move.l #@stereo3_ext_63,TIMERD_VECTOR
rte
stereo_left_over a0
SETUP_ADDIW_IMM INTERVAL_STEREO_LAST_2,counter
move.l #@stereo4_play_62,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo3_ext_16:
TIMERD_DI
VISUAL 3,1
stereo_left_play $78,a0 ;(CH1C2)TL
move.l #@stereo3_ext_61,TIMERD_VECTOR
rte
stereo_left_over a0
SETUP_ADDIW_IMM INTERVAL_STEREO_LAST_2,counter
move.l #@stereo4_play_64,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo3_ext_83:
TIMERD_DI
VISUAL 3,1
stereo_right_play $7F,a0 ;(CH8C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo3_ext_38,TIMERD_VECTOR
rte
@@: move.l #@stereo3_mute_38,TIMERD_VECTOR
rte
stereo_right_over a0
subq.w #1,counter
bcs @f
move.l #@stereo3_ext_36,TIMERD_VECTOR
rte
@@: move.l #@stereo3_mute_36,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo3_ext_63:
TIMERD_DI
VISUAL 3,1
stereo_right_play $7D,a0 ;(CH6C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo3_ext_36,TIMERD_VECTOR
rte
@@: move.l #@stereo3_mute_36,TIMERD_VECTOR
rte
stereo_right_over a0
subq.w #1,counter
bcs @f
move.l #@stereo3_ext_38,TIMERD_VECTOR
rte
@@: move.l #@stereo3_mute_38,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo3_ext_81:
TIMERD_DI
VISUAL 3,1
stereo_right_play $7F,a0 ;(CH8C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo3_ext_18,TIMERD_VECTOR
rte
@@: move.l #@stereo3_mute_18,TIMERD_VECTOR
rte
stereo_right_over a0
subq.w #1,counter
bcs @f
move.l #@stereo3_ext_16,TIMERD_VECTOR
rte
@@: move.l #@stereo3_mute_16,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo3_ext_61:
TIMERD_DI
VISUAL 3,1
stereo_right_play $7D,a0 ;(CH6C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo3_ext_16,TIMERD_VECTOR
rte
@@: move.l #@stereo3_mute_16,TIMERD_VECTOR
rte
stereo_right_over a0
subq.w #1,counter
bcs @f
move.l #@stereo3_ext_18,TIMERD_VECTOR
rte
@@: move.l #@stereo3_mute_18,TIMERD_VECTOR
rte
;left/right共に0が出てこないままカウンタがオーバーフローした
;left/right共にmuteしてchを遷移する
STEREO_ENTRY
@stereo3_mute_37:
TIMERD_DI
VISUAL 3,3
move.b #$7A,OPMADR ;(CH3C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
;次の割り込みに間に合わなくても最短時間で切り換える
OPMDAT_WAIT
stereo_left_play $7B,a0 ;(CH4C2)TL
move.l #@stereo3_mute_74,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo3_mute_72,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo3_mute_17:
TIMERD_DI
VISUAL 3,3
move.b #$78,OPMADR ;(CH1C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
;次の割り込みに間に合わなくても最短時間で切り換える
OPMDAT_WAIT
stereo_left_play $79,a0 ;(CH2C2)TL
move.l #@stereo3_mute_72,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo3_mute_74,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo3_mute_35:
TIMERD_DI
VISUAL 3,3
move.b #$7A,OPMADR ;(CH3C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
;次の割り込みに間に合わなくても最短時間で切り換える
OPMDAT_WAIT
stereo_left_play $7B,a0 ;(CH4C2)TL
move.l #@stereo3_mute_54,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo3_mute_52,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo3_mute_15:
TIMERD_DI
VISUAL 3,3
move.b #$78,OPMADR ;(CH1C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
;次の割り込みに間に合わなくても最短時間で切り換える
OPMDAT_WAIT
stereo_left_play $79,a0 ;(CH2C2)TL
move.l #@stereo3_mute_52,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo3_mute_54,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo3_mute_72:
TIMERD_DI
VISUAL 3,3
OPMDAT_WAIT ;念のため
move.b #$7E,OPMADR ;(CH7C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
;次の割り込みに間に合わなくても最短時間で切り換える
OPMDAT_WAIT
stereo_right_play $7F,a0 ;(CH8C2)TL
SETUP_MOVEW_IMM INTERVAL_STEREO_LAST_1,counter
move.l #@stereo4_play_28,TIMERD_VECTOR
rte
stereo_right_over a0
SETUP_MOVEW_IMM INTERVAL_STEREO_LAST_1,counter
move.l #@stereo4_play_26,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo3_mute_52:
TIMERD_DI
VISUAL 3,3
OPMDAT_WAIT ;念のため
move.b #$7C,OPMADR ;(CH5C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
;次の割り込みに間に合わなくても最短時間で切り換える
OPMDAT_WAIT
stereo_right_play $7D,a0 ;(CH6C2)TL
SETUP_MOVEW_IMM INTERVAL_STEREO_LAST_1,counter
move.l #@stereo4_play_26,TIMERD_VECTOR
rte
stereo_right_over a0
SETUP_MOVEW_IMM INTERVAL_STEREO_LAST_1,counter
move.l #@stereo4_play_28,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo3_mute_74:
TIMERD_DI
VISUAL 3,3
OPMDAT_WAIT ;念のため
move.b #$7E,OPMADR ;(CH7C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
;次の割り込みに間に合わなくても最短時間で切り換える
OPMDAT_WAIT
stereo_right_play $7F,a0 ;(CH8C2)TL
SETUP_MOVEW_IMM INTERVAL_STEREO_LAST_1,counter
move.l #@stereo4_play_48,TIMERD_VECTOR
rte
stereo_right_over a0
SETUP_MOVEW_IMM INTERVAL_STEREO_LAST_1,counter
move.l #@stereo4_play_46,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo3_mute_54:
TIMERD_DI
VISUAL 3,3
OPMDAT_WAIT ;念のため
move.b #$7C,OPMADR ;(CH5C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
;次の割り込みに間に合わなくても最短時間で切り換える
OPMDAT_WAIT
stereo_right_play $7D,a0 ;(CH6C2)TL
SETUP_MOVEW_IMM INTERVAL_STEREO_LAST_1,counter
move.l #@stereo4_play_46,TIMERD_VECTOR
rte
stereo_right_over a0
SETUP_MOVEW_IMM INTERVAL_STEREO_LAST_1,counter
move.l #@stereo4_play_48,TIMERD_VECTOR
rte
;leftだけ0が出てこないままカウンタがオーバーフローした
;leftだけmuteしてchを遷移する
STEREO_ENTRY
@stereo3_mute_38:
TIMERD_DI
VISUAL 3,2
move.b #$7A,OPMADR ;(CH3C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
SETUP_MOVEW_IMM INTERVAL_STEREO_LAST_2,counter
move.l #@stereo4_start_48,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo3_mute_18:
TIMERD_DI
VISUAL 3,2
move.b #$78,OPMADR ;(CH1C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
SETUP_MOVEW_IMM INTERVAL_STEREO_LAST_2,counter
move.l #@stereo4_start_28,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo3_mute_36:
TIMERD_DI
VISUAL 3,2
move.b #$7A,OPMADR ;(CH3C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
SETUP_MOVEW_IMM INTERVAL_STEREO_LAST_2,counter
move.l #@stereo4_start_46,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo3_mute_16:
TIMERD_DI
VISUAL 3,2
move.b #$78,OPMADR ;(CH1C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
SETUP_MOVEW_IMM INTERVAL_STEREO_LAST_2,counter
move.l #@stereo4_start_26,TIMERD_VECTOR
rte
;rightだけ0が出てこないままカウンタがオーバーフローした
;rightだけmuteしてchを遷移する
STEREO_ENTRY
@stereo3_mute_47:
TIMERD_DI
VISUAL 3,4
stereo_left_play $7B,a0 ;(CH4C2)TL
move.l #@stereo3_mute_84,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo3_mute_82,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo3_mute_27:
TIMERD_DI
VISUAL 3,4
stereo_left_play $79,a0 ;(CH2C2)TL
move.l #@stereo3_mute_82,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo3_mute_84,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo3_mute_45:
TIMERD_DI
VISUAL 3,4
stereo_left_play $7B,a0 ;(CH4C2)TL
move.l #@stereo3_mute_64,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo3_mute_62,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo3_mute_25:
TIMERD_DI
VISUAL 3,4
stereo_left_play $79,a0 ;(CH2C2)TL
move.l #@stereo3_mute_62,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo3_mute_64,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo3_mute_84:
TIMERD_DI
VISUAL 3,4
move.b #$7E,OPMADR ;(CH7C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
;次の割り込みに間に合わなくても最短時間で切り換える
OPMDAT_WAIT
stereo_right_play $7F,a0 ;(CH8C2)TL
SETUP_ADDIW_IMM INTERVAL_STEREO_LAST_1,counter
move.l #@stereo4_play_48,TIMERD_VECTOR
rte
stereo_right_over a0
SETUP_ADDIW_IMM INTERVAL_STEREO_LAST_1,counter
move.l #@stereo4_play_46,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo3_mute_64:
TIMERD_DI
VISUAL 3,4
move.b #$7C,OPMADR ;(CH5C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
;次の割り込みに間に合わなくても最短時間で切り換える
OPMDAT_WAIT
stereo_right_play $7D,a0 ;(CH6C2)TL
SETUP_ADDIW_IMM INTERVAL_STEREO_LAST_1,counter
move.l #@stereo4_play_46,TIMERD_VECTOR
rte
stereo_right_over a0
SETUP_ADDIW_IMM INTERVAL_STEREO_LAST_1,counter
move.l #@stereo4_play_48,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo3_mute_82:
TIMERD_DI
VISUAL 3,4
move.b #$7E,OPMADR ;(CH7C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
;次の割り込みに間に合わなくても最短時間で切り換える
OPMDAT_WAIT
stereo_right_play $7F,a0 ;(CH8C2)TL
SETUP_ADDIW_IMM INTERVAL_STEREO_LAST_1,counter
move.l #@stereo4_play_28,TIMERD_VECTOR
rte
stereo_right_over a0
SETUP_ADDIW_IMM INTERVAL_STEREO_LAST_1,counter
move.l #@stereo4_play_26,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo3_mute_62:
TIMERD_DI
VISUAL 3,4
move.b #$7C,OPMADR ;(CH5C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
;次の割り込みに間に合わなくても最短時間で切り換える
OPMDAT_WAIT
stereo_right_play $7D,a0 ;(CH6C2)TL
SETUP_ADDIW_IMM INTERVAL_STEREO_LAST_1,counter
move.l #@stereo4_play_26,TIMERD_VECTOR
rte
stereo_right_over a0
SETUP_ADDIW_IMM INTERVAL_STEREO_LAST_1,counter
move.l #@stereo4_play_28,TIMERD_VECTOR
rte
;----------------------------------------------------------------
;カウンタがオーバーフローするまでleft,rightの順に交互に出力する
;スピードレートの調整はleftのみで行う
;スピードレートの調整に伴うデータの採取の延期はleft/right共に1データ分
;カウントはrightのみで行う
;データにない0を挟んだ直後は必ず発音する
STEREO_ENTRY
@stereo4_start_48:
TIMERD_DI
VISUAL 4,0
stereo_left_play $7B,a0 ;(CH4C2)TL
move.l #@stereo4_play_84,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo4_play_82,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo4_start_28:
TIMERD_DI
VISUAL 4,0
stereo_left_play $79,a0 ;(CH2C2)TL
move.l #@stereo4_play_82,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo4_play_84,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo4_start_46:
TIMERD_DI
VISUAL 4,0
stereo_left_play $7B,a0 ;(CH4C2)TL
move.l #@stereo4_play_64,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo4_play_62,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo4_start_26:
TIMERD_DI
VISUAL 4,0
stereo_left_play $79,a0 ;(CH2C2)TL
move.l #@stereo4_play_62,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo4_play_64,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo4_play_48:
TIMERD_DI
VISUAL 4,0
stereo_left_play $7B,a0 ;(CH4C2)TL
move.l #@stereo4_play_84,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo4_play_82,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo4_play_28:
TIMERD_DI
VISUAL 4,0
stereo_left_play $79,a0 ;(CH2C2)TL
move.l #@stereo4_play_82,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo4_play_84,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo4_play_46:
TIMERD_DI
VISUAL 4,0
stereo_left_play $7B,a0 ;(CH4C2)TL
move.l #@stereo4_play_64,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo4_play_62,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo4_play_26:
TIMERD_DI
VISUAL 4,0
stereo_left_play $79,a0 ;(CH2C2)TL
move.l #@stereo4_play_62,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo4_play_64,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo4_play_84:
TIMERD_DI
VISUAL 4,0
stereo_right_play $7F,a0 ;(CH8C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo4_play_48,TIMERD_VECTOR
rte
@@: move.l #@stereo4_last_48,TIMERD_VECTOR
rte
stereo_right_over a0
subq.w #1,counter
bcs @f
move.l #@stereo4_play_46,TIMERD_VECTOR
rte
@@: move.l #@stereo4_last_46,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo4_play_64:
TIMERD_DI
VISUAL 4,0
stereo_right_play $7D,a0 ;(CH6C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo4_play_46,TIMERD_VECTOR
rte
@@: move.l #@stereo4_last_46,TIMERD_VECTOR
rte
stereo_right_over a0
subq.w #1,counter
bcs @f
move.l #@stereo4_play_48,TIMERD_VECTOR
rte
@@: move.l #@stereo4_last_48,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo4_play_82:
TIMERD_DI
VISUAL 4,0
stereo_right_play $7F,a0 ;(CH8C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo4_play_28,TIMERD_VECTOR
rte
@@: move.l #@stereo4_last_28,TIMERD_VECTOR
rte
stereo_right_over a0
subq.w #1,counter
bcs @f
move.l #@stereo4_play_26,TIMERD_VECTOR
rte
@@: move.l #@stereo4_last_26,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo4_play_62:
TIMERD_DI
VISUAL 4,0
stereo_right_play $7D,a0 ;(CH6C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo4_play_26,TIMERD_VECTOR
rte
@@: move.l #@stereo4_last_26,TIMERD_VECTOR
rte
stereo_right_over a0
subq.w #1,counter
bcs @f
move.l #@stereo4_play_28,TIMERD_VECTOR
rte
@@: move.l #@stereo4_last_28,TIMERD_VECTOR
rte
;カウンタがオーバーフローしたので,以降はTIMERCのカウンタを監視しながら進む
STEREO_ENTRY
@stereo4_last_48:
TIMERD_DI
VISUAL 4,0
stereo_left_play $7B,a0 ;(CH4C2)TL
move.l #@stereo4_last_84,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo4_last_82,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo4_last_28:
TIMERD_DI
VISUAL 4,0
stereo_left_play $79,a0 ;(CH2C2)TL
move.l #@stereo4_last_82,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo4_last_84,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo4_last_46:
TIMERD_DI
VISUAL 4,0
stereo_left_play $7B,a0 ;(CH4C2)TL
move.l #@stereo4_last_64,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo4_last_62,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo4_last_26:
TIMERD_DI
VISUAL 4,0
stereo_left_play $79,a0 ;(CH2C2)TL
move.l #@stereo4_last_62,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo4_last_64,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo4_last_84:
TIMERD_DI
VISUAL 4,0
stereo_right_play $7F,a0 ;(CH8C2)TL
DELTA_CHECK
move.l #@stereo4_last_48,TIMERD_VECTOR
rte
DELTA_OVER
SETUP_MOVEW_IMM MUTE_STEREO_DELAY_0,counter
move.l #@stereo4_ext_48,TIMERD_VECTOR
rte
stereo_right_over a0
DELTA_CHECK
move.l #@stereo4_last_46,TIMERD_VECTOR
rte
DELTA_OVER
SETUP_MOVEW_IMM MUTE_STEREO_DELAY_0,counter
move.l #@stereo4_ext_46,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo4_last_64:
TIMERD_DI
VISUAL 4,0
stereo_right_play $7D,a0 ;(CH6C2)TL
DELTA_CHECK
move.l #@stereo4_last_46,TIMERD_VECTOR
rte
DELTA_OVER
SETUP_MOVEW_IMM MUTE_STEREO_DELAY_0,counter
move.l #@stereo4_ext_46,TIMERD_VECTOR
rte
stereo_right_over a0
DELTA_CHECK
move.l #@stereo4_last_48,TIMERD_VECTOR
rte
DELTA_OVER
SETUP_MOVEW_IMM MUTE_STEREO_DELAY_0,counter
move.l #@stereo4_ext_48,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo4_last_82:
TIMERD_DI
VISUAL 4,0
stereo_right_play $7F,a0 ;(CH8C2)TL
DELTA_CHECK
move.l #@stereo4_last_28,TIMERD_VECTOR
rte
DELTA_OVER
SETUP_MOVEW_IMM MUTE_STEREO_DELAY_0,counter
move.l #@stereo4_ext_28,TIMERD_VECTOR
rte
stereo_right_over a0
DELTA_CHECK
move.l #@stereo4_last_26,TIMERD_VECTOR
rte
DELTA_OVER
SETUP_MOVEW_IMM MUTE_STEREO_DELAY_0,counter
move.l #@stereo4_ext_26,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo4_last_62:
TIMERD_DI
VISUAL 4,0
stereo_right_play $7D,a0 ;(CH6C2)TL
DELTA_CHECK
move.l #@stereo4_last_26,TIMERD_VECTOR
rte
DELTA_OVER
SETUP_MOVEW_IMM MUTE_STEREO_DELAY_0,counter
move.l #@stereo4_ext_26,TIMERD_VECTOR
rte
stereo_right_over a0
DELTA_CHECK
move.l #@stereo4_last_28,TIMERD_VECTOR
rte
DELTA_OVER
SETUP_MOVEW_IMM MUTE_STEREO_DELAY_0,counter
move.l #@stereo4_ext_28,TIMERD_VECTOR
rte
;left/rightそれぞれ0が出てくるまで待ち,0が出てきたら個々に次のchに遷移する
;0が出てこなくてもカウンタがオーバーフローしたら強制的に次のchに遷移する
;カウントはrightのみで行う
;まだleft/right共に0が出てきていない
STEREO_ENTRY
@stereo4_ext_48:
TIMERD_DI
VISUAL 4,1
stereo_left_play $7B,a0 ;(CH4C2)TL
move.l #@stereo4_ext_84,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo4_ext_83,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo4_ext_28:
TIMERD_DI
VISUAL 4,1
stereo_left_play $79,a0 ;(CH2C2)TL
move.l #@stereo4_ext_82,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo4_ext_81,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo4_ext_46:
TIMERD_DI
VISUAL 4,1
stereo_left_play $7B,a0 ;(CH4C2)TL
move.l #@stereo4_ext_64,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo4_ext_63,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo4_ext_26:
TIMERD_DI
VISUAL 4,1
stereo_left_play $79,a0 ;(CH2C2)TL
move.l #@stereo4_ext_62,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo4_ext_61,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo4_ext_84:
TIMERD_DI
VISUAL 4,1
stereo_right_play $7F,a0 ;(CH8C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo4_ext_48,TIMERD_VECTOR
rte
@@: move.l #@stereo4_mute_48,TIMERD_VECTOR
rte
stereo_right_over a0
subq.w #1,counter
bcs @f
move.l #@stereo4_ext_46,TIMERD_VECTOR
rte
@@: move.l #@stereo4_mute_47,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo4_ext_64:
TIMERD_DI
VISUAL 4,1
stereo_right_play $7D,a0 ;(CH6C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo4_ext_46,TIMERD_VECTOR
rte
@@: move.l #@stereo4_mute_46,TIMERD_VECTOR
rte
stereo_right_over a0
subq.w #1,counter
bcs @f
move.l #@stereo4_ext_48,TIMERD_VECTOR
rte
@@: move.l #@stereo4_mute_45,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo4_ext_82:
TIMERD_DI
VISUAL 4,1
stereo_right_play $7F,a0 ;(CH8C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo4_ext_28,TIMERD_VECTOR
rte
@@: move.l #@stereo4_mute_28,TIMERD_VECTOR
rte
stereo_right_over a0
subq.w #1,counter
bcs @f
move.l #@stereo4_ext_26,TIMERD_VECTOR
rte
@@: move.l #@stereo4_mute_27,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo4_ext_62:
TIMERD_DI
VISUAL 4,1
stereo_right_play $7D,a0 ;(CH6C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo4_ext_26,TIMERD_VECTOR
rte
@@: move.l #@stereo4_mute_26,TIMERD_VECTOR
rte
stereo_right_over a0
subq.w #1,counter
bcs @f
move.l #@stereo4_ext_28,TIMERD_VECTOR
rte
@@: move.l #@stereo4_mute_25,TIMERD_VECTOR
rte
;leftだけ0が出てきて次のchに遷移した
;rightに0が出てきたら次のchに遷移する
STEREO_ENTRY
@stereo4_ext_18:
TIMERD_DI
VISUAL 4,1
stereo_left_play $78,a0 ;(CH1C2)TL
move.l #@stereo4_ext_81,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo4_ext_83,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo4_ext_38:
TIMERD_DI
VISUAL 4,1
stereo_left_play $7A,a0 ;(CH3C2)TL
move.l #@stereo4_ext_83,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo4_ext_81,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo4_ext_16:
TIMERD_DI
VISUAL 4,1
stereo_left_play $78,a0 ;(CH1C2)TL
move.l #@stereo4_ext_61,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo4_ext_63,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo4_ext_36:
TIMERD_DI
VISUAL 4,1
stereo_left_play $7A,a0 ;(CH3C2)TL
move.l #@stereo4_ext_63,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo4_ext_61,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo4_ext_81:
TIMERD_DI
VISUAL 4,1
stereo_right_play $7F,a0 ;(CH8C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo4_ext_18,TIMERD_VECTOR
rte
@@: move.l #@stereo4_mute_18,TIMERD_VECTOR
rte
stereo_right_over a0
SETUP_ADDIW_IMM INTERVAL_STEREO_2,counter
move.l #@stereo1_play_17,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo4_ext_61:
TIMERD_DI
VISUAL 4,1
stereo_right_play $7D,a0 ;(CH6C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo4_ext_16,TIMERD_VECTOR
rte
@@: move.l #@stereo4_mute_16,TIMERD_VECTOR
rte
stereo_right_over a0
SETUP_ADDIW_IMM INTERVAL_STEREO_2,counter
move.l #@stereo1_play_15,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo4_ext_83:
TIMERD_DI
VISUAL 4,1
stereo_right_play $7F,a0 ;(CH8C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo4_ext_38,TIMERD_VECTOR
rte
@@: move.l #@stereo4_mute_38,TIMERD_VECTOR
rte
stereo_right_over a0
SETUP_ADDIW_IMM INTERVAL_STEREO_2,counter
move.l #@stereo1_play_37,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo4_ext_63:
TIMERD_DI
VISUAL 4,1
stereo_right_play $7D,a0 ;(CH6C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo4_ext_36,TIMERD_VECTOR
rte
@@: move.l #@stereo4_mute_36,TIMERD_VECTOR
rte
stereo_right_over a0
SETUP_ADDIW_IMM INTERVAL_STEREO_2,counter
move.l #@stereo1_play_35,TIMERD_VECTOR
rte
;rightだけ0が出てきて次のchに遷移した
;leftに0が出てきたら次のchに遷移する
STEREO_ENTRY
@stereo4_ext_45:
TIMERD_DI
VISUAL 4,1
stereo_left_play $7B,a0 ;(CH4C2)TL
move.l #@stereo4_ext_54,TIMERD_VECTOR
rte
stereo_left_over a0
SETUP_ADDIW_IMM INTERVAL_STEREO_2,counter
move.l #@stereo1_play_53,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo4_ext_25:
TIMERD_DI
VISUAL 4,1
stereo_left_play $79,a0 ;(CH2C2)TL
move.l #@stereo4_ext_52,TIMERD_VECTOR
rte
stereo_left_over a0
SETUP_ADDIW_IMM INTERVAL_STEREO_2,counter
move.l #@stereo1_play_51,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo4_ext_47:
TIMERD_DI
VISUAL 4,1
stereo_left_play $7B,a0 ;(CH4C2)TL
move.l #@stereo4_ext_74,TIMERD_VECTOR
rte
stereo_left_over a0
SETUP_ADDIW_IMM INTERVAL_STEREO_2,counter
move.l #@stereo1_play_73,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo4_ext_27:
TIMERD_DI
VISUAL 4,1
stereo_left_play $79,a0 ;(CH2C2)TL
move.l #@stereo4_ext_72,TIMERD_VECTOR
rte
stereo_left_over a0
SETUP_ADDIW_IMM INTERVAL_STEREO_2,counter
move.l #@stereo1_play_71,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo4_ext_54:
TIMERD_DI
VISUAL 4,1
stereo_right_play $7C,a0 ;(CH5C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo4_ext_45,TIMERD_VECTOR
rte
@@: move.l #@stereo4_mute_45,TIMERD_VECTOR
rte
stereo_right_over a0
subq.w #1,counter
bcs @f
move.l #@stereo4_ext_47,TIMERD_VECTOR
rte
@@: move.l #@stereo4_mute_47,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo4_ext_74:
TIMERD_DI
VISUAL 4,1
stereo_right_play $7E,a0 ;(CH7C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo4_ext_47,TIMERD_VECTOR
rte
@@: move.l #@stereo4_mute_47,TIMERD_VECTOR
rte
stereo_right_over a0
subq.w #1,counter
bcs @f
move.l #@stereo4_ext_45,TIMERD_VECTOR
rte
@@: move.l #@stereo4_mute_45,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo4_ext_52:
TIMERD_DI
VISUAL 4,1
stereo_right_play $7C,a0 ;(CH5C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo4_ext_25,TIMERD_VECTOR
rte
@@: move.l #@stereo4_mute_25,TIMERD_VECTOR
rte
stereo_right_over a0
subq.w #1,counter
bcs @f
move.l #@stereo4_ext_27,TIMERD_VECTOR
rte
@@: move.l #@stereo4_mute_27,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo4_ext_72:
TIMERD_DI
VISUAL 4,1
stereo_right_play $7E,a0 ;(CH7C2)TL
subq.w #1,counter
bcs @f
move.l #@stereo4_ext_27,TIMERD_VECTOR
rte
@@: move.l #@stereo4_mute_27,TIMERD_VECTOR
rte
stereo_right_over a0
subq.w #1,counter
bcs @f
move.l #@stereo4_ext_25,TIMERD_VECTOR
rte
@@: move.l #@stereo4_mute_25,TIMERD_VECTOR
rte
;left/right共に0が出てこないままカウンタがオーバーフローした
;left/right共にmuteしてchを遷移する
STEREO_ENTRY
@stereo4_mute_48:
TIMERD_DI
VISUAL 4,3
move.b #$7B,OPMADR ;(CH4C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
;次の割り込みに間に合わなくても最短時間で切り換える
OPMDAT_WAIT
stereo_left_play $78,a0 ;(CH1C2)TL
move.l #@stereo4_mute_81,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo4_mute_83,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo4_mute_28:
TIMERD_DI
VISUAL 4,3
move.b #$79,OPMADR ;(CH2C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
;次の割り込みに間に合わなくても最短時間で切り換える
OPMDAT_WAIT
stereo_left_play $7A,a0 ;(CH3C2)TL
move.l #@stereo4_mute_83,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo4_mute_81,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo4_mute_46:
TIMERD_DI
VISUAL 4,3
move.b #$7B,OPMADR ;(CH4C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
;次の割り込みに間に合わなくても最短時間で切り換える
OPMDAT_WAIT
stereo_left_play $78,a0 ;(CH1C2)TL
move.l #@stereo4_mute_61,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo4_mute_63,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo4_mute_26:
TIMERD_DI
VISUAL 4,3
move.b #$79,OPMADR ;(CH2C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
;次の割り込みに間に合わなくても最短時間で切り換える
OPMDAT_WAIT
stereo_left_play $7A,a0 ;(CH3C2)TL
move.l #@stereo4_mute_63,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo4_mute_61,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo4_mute_83:
TIMERD_DI
VISUAL 4,3
OPMDAT_WAIT ;念のため
move.b #$7F,OPMADR ;(CH8C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
;次の割り込みに間に合わなくても最短時間で切り換える
OPMDAT_WAIT
stereo_right_play $7C,a0 ;(CH5C2)TL
SETUP_MOVEW_IMM INTERVAL_STEREO_1,counter
move.l #@stereo1_play_35,TIMERD_VECTOR
rte
stereo_right_over a0
SETUP_MOVEW_IMM INTERVAL_STEREO_1,counter
move.l #@stereo1_play_37,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo4_mute_63:
TIMERD_DI
VISUAL 4,3
OPMDAT_WAIT ;念のため
move.b #$7D,OPMADR ;(CH6C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
;次の割り込みに間に合わなくても最短時間で切り換える
OPMDAT_WAIT
stereo_right_play $7E,a0 ;(CH7C2)TL
SETUP_MOVEW_IMM INTERVAL_STEREO_1,counter
move.l #@stereo1_play_37,TIMERD_VECTOR
rte
stereo_right_over a0
SETUP_MOVEW_IMM INTERVAL_STEREO_1,counter
move.l #@stereo1_play_35,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo4_mute_81:
TIMERD_DI
VISUAL 4,3
OPMDAT_WAIT ;念のため
move.b #$7F,OPMADR ;(CH8C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
;次の割り込みに間に合わなくても最短時間で切り換える
OPMDAT_WAIT
stereo_right_play $7C,a0 ;(CH5C2)TL
SETUP_MOVEW_IMM INTERVAL_STEREO_1,counter
move.l #@stereo1_play_15,TIMERD_VECTOR
rte
stereo_right_over a0
SETUP_MOVEW_IMM INTERVAL_STEREO_1,counter
move.l #@stereo1_play_17,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo4_mute_61:
TIMERD_DI
VISUAL 4,3
OPMDAT_WAIT ;念のため
move.b #$7D,OPMADR ;(CH6C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
;次の割り込みに間に合わなくても最短時間で切り換える
OPMDAT_WAIT
stereo_right_play $7E,a0 ;(CH7C2)TL
SETUP_MOVEW_IMM INTERVAL_STEREO_1,counter
move.l #@stereo1_play_17,TIMERD_VECTOR
rte
stereo_right_over a0
SETUP_MOVEW_IMM INTERVAL_STEREO_1,counter
move.l #@stereo1_play_15,TIMERD_VECTOR
rte
;leftだけ0が出てこないままカウンタがオーバーフローした
;leftだけmuteしてchを遷移する
STEREO_ENTRY
@stereo4_mute_45:
TIMERD_DI
VISUAL 4,2
move.b #$7B,OPMADR ;(CH4C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
SETUP_MOVEW_IMM INTERVAL_STEREO_2,counter
move.l #@stereo1_start_15,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo4_mute_25:
TIMERD_DI
VISUAL 4,2
move.b #$79,OPMADR ;(CH2C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
SETUP_MOVEW_IMM INTERVAL_STEREO_2,counter
move.l #@stereo1_start_35,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo4_mute_47:
TIMERD_DI
VISUAL 4,2
move.b #$7B,OPMADR ;(CH4C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
SETUP_MOVEW_IMM INTERVAL_STEREO_2,counter
move.l #@stereo1_start_17,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo4_mute_27:
TIMERD_DI
VISUAL 4,2
move.b #$79,OPMADR ;(CH2C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
SETUP_MOVEW_IMM INTERVAL_STEREO_2,counter
move.l #@stereo1_start_37,TIMERD_VECTOR
rte
;rightだけ0が出てこないままカウンタがオーバーフローした
;rightだけmuteしてchを遷移する
STEREO_ENTRY
@stereo4_mute_18:
TIMERD_DI
VISUAL 4,4
stereo_left_play $78,a0 ;(CH1C2)TL
move.l #@stereo4_mute_51,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo4_mute_53,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo4_mute_38:
TIMERD_DI
VISUAL 4,4
stereo_left_play $7A,a0 ;(CH3C2)TL
move.l #@stereo4_mute_53,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo4_mute_51,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo4_mute_16:
TIMERD_DI
VISUAL 4,4
stereo_left_play $78,a0 ;(CH1C2)TL
move.l #@stereo4_mute_71,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo4_mute_73,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo4_mute_36:
TIMERD_DI
VISUAL 4,4
stereo_left_play $7A,a0 ;(CH3C2)TL
move.l #@stereo4_mute_73,TIMERD_VECTOR
rte
stereo_left_over a0
move.l #@stereo4_mute_71,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo4_mute_51:
TIMERD_DI
VISUAL 4,4
move.b #$7F,OPMADR ;(CH8C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
;次の割り込みに間に合わなくても最短時間で切り換える
OPMDAT_WAIT
stereo_right_play $7C,a0 ;(CH5C2)TL
SETUP_ADDIW_IMM INTERVAL_STEREO_1,counter
move.l #@stereo1_play_15,TIMERD_VECTOR
rte
stereo_right_over a0
SETUP_ADDIW_IMM INTERVAL_STEREO_1,counter
move.l #@stereo1_play_17,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo4_mute_71:
TIMERD_DI
VISUAL 4,4
move.b #$7D,OPMADR ;(CH6C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
;次の割り込みに間に合わなくても最短時間で切り換える
OPMDAT_WAIT
stereo_right_play $7E,a0 ;(CH7C2)TL
SETUP_ADDIW_IMM INTERVAL_STEREO_1,counter
move.l #@stereo1_play_17,TIMERD_VECTOR
rte
stereo_right_over a0
SETUP_ADDIW_IMM INTERVAL_STEREO_1,counter
move.l #@stereo1_play_15,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo4_mute_53:
TIMERD_DI
VISUAL 4,4
move.b #$7F,OPMADR ;(CH8C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
;次の割り込みに間に合わなくても最短時間で切り換える
OPMDAT_WAIT
stereo_right_play $7C,a0 ;(CH5C2)TL
SETUP_ADDIW_IMM INTERVAL_STEREO_1,counter
move.l #@stereo1_play_35,TIMERD_VECTOR
rte
stereo_right_over a0
SETUP_ADDIW_IMM INTERVAL_STEREO_1,counter
move.l #@stereo1_play_37,TIMERD_VECTOR
rte
STEREO_ENTRY
@stereo4_mute_73:
TIMERD_DI
VISUAL 4,4
move.b #$7D,OPMADR ;(CH6C2)TL
OPMADR_WAIT
move.b #ZERO_TL,OPMDAT
;次の割り込みに間に合わなくても最短時間で切り換える
OPMDAT_WAIT
stereo_right_play $7E,a0 ;(CH7C2)TL
SETUP_ADDIW_IMM INTERVAL_STEREO_1,counter
move.l #@stereo1_play_37,TIMERD_VECTOR
rte
stereo_right_over a0
SETUP_ADDIW_IMM INTERVAL_STEREO_1,counter
move.l #@stereo1_play_35,TIMERD_VECTOR
rte
;----------------------------------------------------------------
.endm
mono_both_play .macro aw,an
move.l an,-(sp) ;12
movea.l pointer,an ;16
.if aw
OPMADR_WAIT
.endif
move.b (an)+,OPMDAT ;20
bmi.s 55f ;8/10
move.l an,pointer ;20
66: movea.l (sp)+,an ;12
.endm
mono_both_over .macro an
33: tst.b (1,an)
beq.s 44f
.if CURRENT_TIME
lea.l nxttop,an ;8
move.l (an)+,(an) ;20 nxttop→pointer
move.l (an)+,(an)+ ;20 nxttop→curtop
move.l an,(nxttop-dummy_opm_data,an) ;16 #dummy_opm_data→nxttop
.else
lea.l nxttop,an ;8
move.l (an)+,(an)+ ;20 nxttop→pointer
move.l an,(nxttop-dummy_opm_data,an) ;16 #dummy_opm_data→nxttop
.endif
bra.s 77f ;10
44:
.if CURRENT_TIME
lea.l nxttop,an ;8
move.l (an)+,(an) ;20 nxttop→pointer
move.l (an)+,(an)+ ;20 nxttop→curtop
move.l an,(nxttop-dummy_opm_data,an) ;16 #dummy_opm_data→nxttop
.else
lea.l nxttop,an ;8
move.l (an)+,(an)+ ;20 nxttop→pointer
move.l an,(nxttop-dummy_opm_data,an) ;16 #dummy_opm_data→nxttop
.endif
bra.s 66b ;10
55: tst.b (an) ;8 $00,$00=符号反転せずにバッファ終了
; $00,$01=符号反転してバッファ終了
; $01~=符号反転
beq.s 33b ;8/10
move.l an,pointer ;20
77: movea.l (sp)+,an ;12
.endm
stereo_left_play .macro imm,an
move.b #imm,OPMADR
move.l an,-(sp) ;12
movea.l pointer,an
OPMADR_WAIT
move.b (an)+,OPMDAT ;20
bmi.s 55f ;8/10
;left側はpointerを更新しない
66: movea.l (sp)+,an ;12
.endm
stereo_left_over .macro an
55: ;left側の負数は符号反転のみ
movea.l (sp)+,an ;12
.endm
stereo_right_play .macro imm,an
move.b #imm,OPMADR
move.l an,-(sp) ;12
movea.l pointer,an
addq.l #1,an ;8
OPMADR_WAIT
move.b (an)+,OPMDAT ;20
bmi.s 55f ;8/10
move.l an,pointer ;20
66: movea.l (sp)+,an ;12
.endm
stereo_right_over .macro an
33: tst.b (1,an)
beq.s 44f
.if CURRENT_TIME
lea.l nxttop,an ;8
move.l (an)+,(an) ;20 nxttop→pointer
move.l (an)+,(an)+ ;20 nxttop→curtop
move.l an,(nxttop-dummy_opm_data,an) ;16 #dummy_opm_data→nxttop
.else
lea.l nxttop,an
move.l (an)+,(an)+ ;20 nxttop→pointer
move.l an,(nxttop-dummy_opm_data,an) ;16 #dummy_opm_data→nxttop
.endif
bra.s 77f
44:
.if CURRENT_TIME
lea.l nxttop,an ;8
move.l (an)+,(an) ;20 nxttop→pointer
move.l (an)+,(an)+ ;20 nxttop→curtop
move.l an,(nxttop-dummy_opm_data,an) ;16 #dummy_opm_data→nxttop
.else
lea.l nxttop,an
move.l (an)+,(an)+ ;20 nxttop→pointer
move.l an,(nxttop-dummy_opm_data,an) ;16 #dummy_opm_data→nxttop
.endif
bra.s 66b
55: tst.b (an) ;$00,$00=符号反転せずにバッファ終了
;$00,$01=符号反転してバッファ終了
;$01~=符号反転
beq.s 33b
move.l an,pointer ;20
77: movea.l (sp)+,an ;12
.endm
;----------------------------------------------------------------
;TIMERD割り込みのエントリの手前に配置するマクロ
; TIMERD割り込みは4バイトアラインメントされたアドレスに配置される.
KEYON_ENTRY .macro
.align 4,$2048
.endm
MONO_ENTRY .macro
.align 4,$2048
.endm
STEREO_ENTRY .macro
.align 4,$2048
.endm
;----------------------------------------------------------------
DELTA_CHECK .macro
move.b d0,-(sp)
move.b delta_timerc,d0 ;TCDRの目標値
sub.b TCDR,d0
bpl.s 22f ;TCDRが目標値と一致または下回れば次の1/4周期へ
move.b (sp)+,d0
.endm
DELTA_OVER .macro
22: move.b (sp)+,d0
subi.w #DELTA_TIMERC,delta_timerc
.endm
;----------------------------------------------------------------
.if TEST_TIMERD=0
VISUAL .macro ch,ex
.endm
.else
.if TEST_TIMERD=1
VISUAL .macro ch,ex
.if ch=1
move.w #%00000_00000_00000_0,$00E82200
.elif ch=2
move.w #%00000_00000_01111_0,$00E82200
.elif ch=3
move.w #%00000_01111_00000_0,$00E82200
.elif ch=4
move.w #%00000_01111_01111_0,$00E82200
.endif
.endm
.elif TEST_TIMERD=2
VISUAL .macro ch,ex
.if ex=0
move.w #%00000_00000_00000_0,$00E82200
.elif ex=1 ;0待ち
move.w #%00000_00000_00111_0,$00E82200
.elif ex=2 ;leftのみオーバー
move.w #%11111_00000_11111_0,$00E82200
.elif ex=3 ;left/rightともオーバー
move.w #%11111_11111_00000_0,$00E82200
.elif ex=4 ;rightのみオーバー
move.w #%11111_11111_11111_0,$00E82200
.endif
.endm
.endif
.endif
;----------------------------------------------------------------
;TIMERD割り込みルーチンの実体
SETUP_LIST_START
;----------------------------------------------------------------
;X68000の場合
;割り込みが重くなりすぎたときにキー入力が効かなくならないように,割り込みを禁止しない.
TIMERD_DI .macro
.endm
;X68000ではFM音源レジスタのアクセスにハードウェアでウェイトが入っていないので,
;FM音源アドレスレジスタのアクセスとFM音源データレジスタのアクセスの間に
;ウェイトを入れる必要がある.
OPMADR_WAIT .macro
@wait:
tst.b OPMDAT
bmi @wait
.endm
.text
.align 4,$2048
mono_keyon_x68000:
mono_body
.text
.align 4,$2048
stereo_keyon_x68000:
stereo_body
;----------------------------------------------------------------
;X68030の場合
TIMERD_DI .macro
***** DI
.endm
;X68030ではFM音源レジスタのアクセスにハードウェアでウェイトが入っているので,
;FM音源アドレスレジスタのアクセスとFM音源データレジスタのアクセスの間に
;ウェイトを入れる必要がない.
OPMADR_WAIT .macro
.endm
.text
.align 4,$2048
mono_keyon_x68030:
mono_body
.text
.align 4,$2048
stereo_keyon_x68030:
stereo_body
;----------------------------------------------------------------
SETUP_LIST_END
;----------------------------------------------------------------
;TIMERD割り込みルーチンが使用するワークエリア
.data
.even
counter: .ds.w 1
delta_timerc: .ds.w 1
.align 4
;nxttopとpointerとcurtopとdummy_opm_dataは必ずこの順序で連続して配置すること
nxttop:: .ds.l 1 ;現在のバッファを使い終わった後に使うバッファの先頭
pointer: .ds.l 1 ;バッファ内の次のOPMデータを指すポインタ
.if CURRENT_TIME
curtop: .ds.l 1 ;現在再生中のバッファの先頭
.endif
dummy_opm_data: .dc.b 0,0,0,0 ;ダミーデータはモノラル用とステレオ用で分けるため,
;再生開始直前に設定する